Ehcache密钥...从StoreAccessException中恢复:NullPointerException:null值

时间:2017-03-17 11:10:23

标签: java caching nullpointerexception ehcache

我正在尝试使用<ListBox Name="ListBoxOne"> <ListBox.Style> <Style TargetType="ListBox"> <Setter Property="ItemContainerStyle" Value="{StaticResource MyListBoxItemStyle}"/> </Style> </ListBox.Style> </ListBox> 缓存应用程序使用的(远程)图像文件。

我通过以下方式初始化缓存:

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

我想知道,如果这是出于设计行为,还是我忘了提供像复印机这样的东西?

更新

看起来这种情况发生在代码中,负责从内部组件failers恢复缓存。不幸的是,我既不能推断,哪些组件失败,也不能禁用这些打印输出。

例如,我无法仅为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

更新2

值本身不是RobustResilienceStrategy,我已经检查过了。 Null出现在更深处。另请注意,当我从缓存中读取时会出现该消息。另请注意,它也不例外,它是stdout中的打印输出。如果我将null作为一个值,我会得到明显的异常。

更新3

我后来的调查(未完成)表明问题可能与层之间的复制有关。此外,它会导致某些键永远无法写入缓存(缓存在放置后似乎不会立即包含它们)。如果我禁用磁盘层,问题就会消失。

1 个答案:

答案 0 :(得分:1)

基于Caused by: java.lang.NullPointerException: null value,看起来您尝试放入缓存的值是null ...? 可以loadImage(imageFileKey.getImageFile(), imageFileKey.getImageFilter());返回null吗?

这会解决吗? if (ans != null) cache.put(imageFileKey, ans);

或者你真的需要缓存缺少某些东西?如果是这种情况我你将不得不使用专用的魔法值(null除外)