Ключ Ehcache... восстановлен из StoreAccessException: NullPointerException: нулевое значение
Я пытаюсь использовать EHCache
для кэширования (удаленных) файлов изображений мое приложение использует.
Я инициализировал кеш следующим образом:
poolsBuilder = ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(1024, MemoryUnit.MB)
.disk(50, MemoryUnit.GB);
configurationBuilder = CacheConfigurationBuilder
.newCacheConfigurationBuilder(ImageFileKey.class, BufferedImage.class, poolsBuilder)
.withValueSerializer(new BufferedImageSerializer())
;
cacheManager = (PersistentCacheManager) CacheManagerBuilder.newCacheManagerBuilder()
.with(new CacheManagerPersistenceConfiguration(TempDirectory))
.withCache("BufferedImageCache", configurationBuilder)
.build(true);
cache = cacheManager
.getCache("BufferedImageCache", ImageFileKey.class, BufferedImage.class);
ImageFileKey
содержит имя файла и дополнительную информацию о фильтре изображений, которую я использую.
Видимо кеш работает, но следующим способом
public BufferedImage getImage(ImageFileKey imageFileKey) {
BufferedImage ans = cache.get(imageFileKey);
if( ans == null ) {
try {
ans = loadImage(imageFileKey.getImageFile(), imageFileKey.getImageFilter());
cache.put(imageFileKey, ans);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return ans;
}
когда я бегу BufferedImage ans = cache.get(imageFileKey)
и он возвращается null
Я вижу сообщение об ошибке на консоли:
org.ehcache.core.spi.store.StoreAccessException: java.lang.NullPointerException: null value
at org.ehcache.impl.internal.store.heap.OnHeapStore.resolveFault(OnHeapStore.java:810) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
at org.ehcache.impl.internal.store.heap.OnHeapStore.getOrComputeIfAbsent(OnHeapStore.java:733) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
at org.ehcache.impl.internal.store.tiering.TieredStore.get(TieredStore.java:99) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
at org.ehcache.core.Ehcache.get(Ehcache.java:169) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
at com.cireca.overlaywidget.ehcache.BufferedImageCache.getImage(BufferedImageCache.java:99) [main/:na]
at com.cireca.overlaywidget.ehcache.BufferedImageCache.getImage(BufferedImageCache.java:113) [main/:na]
at com.cireca.overlaywidget.piccolo2d.PCachedImage.paint(PCachedImage.java:225) [main/:na]
...
Caused by: java.lang.NullPointerException: null value
at org.ehcache.impl.internal.store.heap.holders.CopiedOnHeapValueHolder.<init>(CopiedOnHeapValueHolder.java:57) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
at org.ehcache.impl.internal.store.heap.OnHeapStore.cloneValueHolder(OnHeapStore.java:1514) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
at org.ehcache.impl.internal.store.heap.OnHeapStore.importValueFromLowerTier(OnHeapStore.java:1492) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
at org.ehcache.impl.internal.store.heap.OnHeapStore.resolveFault(OnHeapStore.java:763) ~[ehcache-3.3.0.jar:3.3.0 fa4b4a8afb003e55eb74a2da228cacbbd2038073]
Интересно, если это по конструкции поведения, или я забыл предоставить что-то вроде копира?
ОБНОВИТЬ
Похоже, это происходит в части кода, отвечающей за восстановление кеша из внутренних компонентов компонентов. К сожалению, я также не могу определить, какие компоненты выходят из строя, не отключить эти распечатки.
Например, я не могу заменить LoggingRobustResilienceStrategy
Просто для RobustResilienceStrategy
,
ОБНОВЛЕНИЕ 2
Само значение не null
, Я проверил. Ноль появляется где-то глубже. Также обратите внимание, что это сообщение появляется, когда я ЧИТАЮ из кеша. Также обратите внимание, что это не исключение, это распечатка в stdout. Если бы я поместил в качестве значения ноль, я бы получил явное исключение.
ОБНОВЛЕНИЕ 3
Мои более поздние исследования (не законченные) показывают, что проблема, вероятно, связана с копированием между уровнями. Кроме того, это приводит к тому, что некоторые ключи невозможно записать в кеш (кеш, по-видимому, не содержит их сразу после установки). Если я отключу уровень диска, проблема исчезнет.
1 ответ
На основании Caused by: java.lang.NullPointerException: null value
Похоже, значение, которое вы пытаетесь поместить в кеш null
...? Мог loadImage(imageFileKey.getImageFile(), imageFileKey.getImageFilter());
вернуть null
?
Это исправит это?
if (ans != null)
cache.put(imageFileKey, ans);
Или вам действительно нужно кешировать отсутствие чего-либо? Если это так, я думаю, вам придется использовать специальное магическое значение (кроме null
) для этого