【问题标题】:Error- Ehcache key 1 recovered fromorg.ehcache.spi.resilience.StoreAccessException错误 - 从 org.ehcache.spi.resilience.StoreAccessException 恢复的 Ehcache 密钥 1
【发布时间】:2021-12-26 10:24:19
【问题描述】:

我正在尝试将 EHCache3 与 Spring Boot 应用程序一起使用。 所以我做了以下相同的配置。

EhcacheConfig-->


@Configuration
@EnableCaching
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class EhcacheConfig {

    @Bean
    CacheManager getCacheManager() {

        CachingProvider provider = Caching.getCachingProvider();
        CacheManager cacheManager = provider.getCacheManager();

        CacheConfigurationBuilder<Integer, WorklistListResponse> configurationBuilder =
                CacheConfigurationBuilder.newCacheConfigurationBuilder(
                                Integer.class,
                                WorklistListResponse.class,
                                ResourcePoolsBuilder.heap(1000).offheap(25, MemoryUnit.MB))
                        .withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofMinutes(2)));
        CacheEventListenerConfigurationBuilder asynchronousListener = CacheEventListenerConfigurationBuilder
                .newEventListenerConfiguration(new CacheEventLogger()
                        , EventType.CREATED, EventType.EXPIRED).unordered().asynchronous();
        //create caches we need
        cacheManager.createCache("WorkListCache",
                Eh107Configuration.fromEhcacheCacheConfiguration(configurationBuilder.add(asynchronousListener)));

        return cacheManager;
    }
}

从服务类调用缓存-->

 @Override
    @Cacheable(cacheNames="WorkListCache",key = "#filterRequest.currentPage")
    public WorklistListResponse getFilterWorklists(FilterRequest filterRequest) {
        log.info("From Service Layer Call...");

使用 Swagger Code Gen 生成的预期缓存对象-->

/**
 * WorklistListResponse
 */
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2021-11-12T15:55:02.856537800+05:30[Asia/Calcutta]")

public class WorklistListResponse  implements Serializable {
  private static final long serialVersionUID = 1L;

  @JsonProperty("worklist")
  @Valid
  private List<WorklistResponse> worklist = null;

  @JsonProperty("totalRecordsCount")
  private Integer totalRecordsCount;

但是在这个配置之后,我遇到了错误--

2021-11-15 12:08:34,596 [INFO ][task-management][TraceId:4c4129367aa6ee47][WorklistServiceImpl.getFilterWorklists:179] - From Service Layer Call...
2021-11-15 12:08:34,666 [INFO ][task-management][TraceId:4c4129367aa6ee47][AbstractResilienceStrategy.recovered:116] - Ehcache key 1 recovered fromorg.ehcache.spi.resilience.StoreAccessException: org.ehcache.spi.serialization.SerializerException: java.io.NotSerializableException: java.util.ArrayList$SubList
    at org.ehcache.core.exceptions.StorePassThroughException.handleException(StorePassThroughException.java:78)
    at org.ehcache.impl.internal.store.offheap.AbstractOffHeapStore.computeWithRetry(AbstractOffHeapStore.java:1042)
    at org.ehcache.impl.internal.store.offheap.AbstractOffHeapStore.put(AbstractOffHeapStore.java:247)

谁能帮我理解这里的问题?

谢谢

【问题讨论】:

    标签: spring-boot caching ehcache spring-cache


    【解决方案1】:

    您可能正在调用不可序列化的 .subList()。

    //JDK Code
    public List<E> subList(int fromIndex, int toIndex) {
        subListRangeCheck(fromIndex, toIndex, size);
        return new SubList(this, 0, fromIndex, toIndex);
    }
    

    SubList 是一个私有静态内部类,没有实现 Serializable:

     private static class SubList<E> extends AbstractList<E> implements RandomAccess {
    

    解决方案:new ArrayList(yourList.subList());

    resolve a java.util.ArrayList$SubList notSerializable Exception

    【讨论】:

    • 感谢您的回复。但是我没有使用任何子列表,我必须保留一个 java 对象(worklistresponse)作为缓存,由于 swagger 代码生成规则,它是不可编辑的类。
    猜你喜欢
    • 2019-03-20
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2022-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多