为 Axon Sagas 启用 Ehcache 缓存

Enable Ehcache caching for Axon Sagas

我的目标是使用 newCacheManagerBuilder() API 创建 2 个缓存并将它们存储在堆外

我的理解是我需要一个缓存用于 Saga 实例,一个用于关联。首先我正在初始化缓存管理器。

    @Bean
    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
    public CacheManager cacheManager() {
        CacheManager cacheManager =  CacheManagerBuilder.newCacheManagerBuilder().build();
        cacheManager.init();
        return cacheManager;
    }

    @Bean
    public org.ehcache.Cache<String, MySaga> sagaEhcache(CacheManager cacheManager) {
        return cacheManager.createCache("sagaEhcache",
            CacheConfigurationBuilder.newCacheConfigurationBuilder(
                String.class,
                MySaga.class,
                ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(sagaCacheOffHeapMb, MemoryUnit.MB)
            ).build()
        );
    }

    @Bean
    public org.ehcache.Cache<String, AssociationValue> sagaAssocEhcache(CacheManager cacheManager) {
        return cacheManager.createCache("sagaAssocEhcache",
            CacheConfigurationBuilder.newCacheConfigurationBuilder(
                String.class,
                AssociationValue.class,
                ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(sagaAssocCacheOffHeapMb, MemoryUnit.MB)
            ).build()
        );
    }

提到的映射是否正确:String/MySaga 和 String/AssociationValue?

Axon Framework 使用缓存适配器的概念来将缓存用于 CachingSagaStoreCachingEventSourcingRepository 之类的东西。 两者都需要 Cache 的 Axon 实现,它可以回溯到允许您使用 JCacheAdapterEhCacheAdapter。 当您使用 EhCache 时,您需要在设置中使用 EhCacheAdapter

但是您的设置存在一个缺点。 您正在使用 org.ehcache, thus version 3. Axon Framework however uses net.sf.ehcache,因此是版本 2。 因此,除非有某种机制可以将 EhCache 版本 3 恢复为版本 2,否则您现在需要实际降级应用程序中的 EhCache 版本。


更新

如评论中所示,您已经实现了自己的 EhCacheAdapter 以支持带有 Axon Framework 的最新版本的 EhCache。因此,这给您留下了以下问题:

Are the mentioned mappings correct: String/MySaga and String/AssociationValue?

检查 CachingSagaStore 实现,您可以看到 CacheEntry<S> 用于 Saga,Set<String> 用于关联。通用 S 代表 Saga 实现,因此在您的示例中 MySaga


更新 2

对于利用 Axon 框架和 EhCache 版本 2 的示例项目,您可以查看 Axon Trader 应用程序。