Я должен использовать LoadingCache
Guava для кэширования выражения xpath в значения xpath.
Проблема в том, что не все xpaths имеют значения. В большинстве случаев значение равно null
.
Фрагмент кода:
private LoadingCache<String, List<String>> cachedXpaths = CacheBuilder.newBuilder()
.expireAfterWrite(3, TimeUnit.MINUTES)
.maximumSize(1000)
.concurrencyLevel(5)
.weakKeys()
.build(new CacheLoader<String, List<String>>() {
@Override
public List<String> load(String key) throws Exception {
return createListByKey(key);
}
});
private static List<String> createListByKey(String key) throws Exception {
List<String> values = null;
try {
values = instance.getXpathValues(key);
} catch (XPathExpressionException ignore) {
}
return values;
}
Результат:
testEncounterSection(com.epam.cdatest.section.EncountersSectionTest) Time elapsed: 0.002 sec <<< FAILURE!
com.google.common.util.concurrent.UncheckedExecutionException: com.epam.cdatest.exceptions.XpathHasEmptyValueException
at com.epam.cdatest.parsers.XpathEvaluator.getXpathValues(XpathEvaluator.java:123)
at com.epam.cdatest.parsers.XpathEvaluator.createListByKey(XpathEvaluator.java:53)
at com.epam.cdatest.parsers.XpathEvaluator.access$000(XpathEvaluator.java:32)
at com.epam.cdatest.parsers.XpathEvaluator$1.load(XpathEvaluator.java:46)
at com.epam.cdatest.parsers.XpathEvaluator$1.load(XpathEvaluator.java:43)
Как избежать вызова load()
, когда значение xpath пусто?
load()
вместо того, чтобы просто возвращать пустой список? На самом деле кеш не может знать, какие ключи не разрешены, и поэтому попытается загрузить хотя бы один раз. Затем загрузчик должен решить, что делать с ключами. - person Thomas   schedule 16.06.2015return values
, но после этого кеш больше не будет загружать значение для данного ключа и всегда будет возвращать этот пустой список, что указывает на отсутствие значений xpath для этого ключа. - person Thomas   schedule 16.06.2015