ฉันต้องใช้ LoadingCache
ของ Guava เพื่อแคชนิพจน์ xpath เป็นค่า xpath
ปัญหาคือไม่ใช่ว่า xpath ทั้งหมดจะมีค่า โดยส่วนใหญ่แล้วค่าจะเป็น 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