为 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 使用缓存适配器的概念来将缓存用于 CachingSagaStore
或 CachingEventSourcingRepository
之类的东西。
两者都需要 Cache
的 Axon 实现,它可以回溯到允许您使用 JCacheAdapter
或 EhCacheAdapter
。
当您使用 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 应用程序。
我的目标是使用 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 使用缓存适配器的概念来将缓存用于 CachingSagaStore
或 CachingEventSourcingRepository
之类的东西。
两者都需要 Cache
的 Axon 实现,它可以回溯到允许您使用 JCacheAdapter
或 EhCacheAdapter
。
当您使用 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 应用程序。