2017-03-17 4 views
0

EHCache 내 응용 프로그램 사용 (원격) 이미지 파일을 캐시하는 데 사용하려고합니다. Ehcache 키 ... StoreAccessException에서 복구 된 : NullPointerException : null 값

나는 다음과 같은 방법으로 캐시를 초기화 :

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은 파일 이름과 내가 사용하는 추가 이미지 필터 정보가 포함되어 있습니다.

분명히 캐시는 노력하고 있습니다,하지만 난 BufferedImage ans = cache.get(imageFileKey)를 실행하고 null 반환 할 때 다음과 같은 방법으로

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; 
    } 

, 나는 콘솔에 오류 출력을 참조하십시오에 의해이 경우,

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] 

궁금해을 디자인 동작, 또는 복사기 같은 것을 제공하는 것을 잊었습니까? 이 내부 구성 요소의 failers에서 캐시를 복구하는 코드의 일부에 책임이 발생 같은

UPDATE

보인다. 불행히도, 나는 어떤 구성 요소가 실패했는지 추론 할 수 없으며,이 출력물을 무력화 시키지도 않습니다.

예를 들어 RobustResilienceStrategy의 경우 LoggingRobustResilienceStrategy을 바꿀 수 없습니다.

업데이트 2

값 자체는 내가 검사 한 null 없습니다. Null은 더 깊은 곳에서 나타납니다. 또한이 메시지는 캐시에서 READING 할 때 발생합니다. 또한 예외는 아니며 stdout의 출력물입니다. 값으로 null을 넣으면 나는 예외적 인 예외를 얻습니다.

UPDATE 3

내 나중에 inverstigations (완료되지 않음) 문제가 아마 계층 사이의 복사와 관련이 있음을 보여준다. 또한 일부 키가 캐시에 쓸 수 없게됩니다 (캐시는 put 후에 immediatedly 포함하지 않는 것으로 나타납니다). 디스크 계층을 사용하지 않으면 문제가 사라집니다.

답변

1

Caused by: java.lang.NullPointerException: null value을 기준으로하면 캐시에 넣으려는 값이 null ...입니까? loadImage(imageFileKey.getImageFile(), imageFileKey.getImageFilter()); return null?

해결 될까요? if (ans != null) cache.put(imageFileKey, ans);

또는 실제로 무언가 부재를 캐시해야합니까? 그럴 경우 으로 생각하면 전용 마법 값 (null 제외)을 사용해야합니다.

+0

이 값은 null이 아닙니다. Null은 더 깊은 곳에서 나타납니다. – Dims

+0

이것이 사실 인 경우 버그를 발견 한 것 같습니다. 문제를 드러내고 ehcache3 github 버그 추적기에서 공유하는 작은 재현 가능한 테스트 케이스를 함께 넣을 수 있습니다. –