Ключ 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) для этого

Другие вопросы по тегам