Saya harus menggunakan LoadingCache
Guava untuk menyimpan ekspresi xpath ke nilai xpath.
Masalahnya adalah tidak semua xpath memiliki nilai. Seringkali nilainya adalah null
.
Cuplikan kode:
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;
}
Hasil:
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)
Bagaimana cara menghindari panggilan load()
ketika nilai xpath kosong?
load()
daripada hanya mengembalikan daftar kosong? Faktanya, cache tidak dapat mengetahui kunci mana yang tidak diperbolehkan dan karenanya akan mencoba memuat setidaknya sekali. Pemuat kemudian harus memutuskan apa yang harus dilakukan dengan kunci tersebut. - person Thomas   schedule 16.06.2015return values
tetapi setelah itu cache tidak akan memuat nilai untuk kunci yang diberikan lagi dan akan selalu mengembalikan daftar kosong itu, yang menunjukkan bahwa tidak ada nilai xpath untuk kunci itu. - person Thomas   schedule 16.06.2015