【问题标题】:Enable Ehcache caching for Axon Sagas为 Axon Sagas 启用 Ehcache 缓存
【发布时间】:2019-08-16 11:33:30
【问题描述】:

我的目标是使用 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 ?

【问题讨论】:

    标签: ehcache saga axon


    【解决方案1】:

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

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


    更新

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

    上述映射是否正确:String/MySaga 和 String/AssociationValue?

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


    更新 2

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

    【讨论】:

    • 感谢回复,正确。在这方面,我创建了自己的 EhCacheAdapter,它实现了来自 org.axonframework.common.caching 的 Cache 接口,我认为它应该可以工作。我更关心实际的映射 String/MySaga 和 String/AssociationValue。他们正确吗?
    • 啊,好吧,那你就明白了;伟大的!如果您有时间,我们将非常感谢您为支持最新 EhCache 的 Axon Framework 做出贡献!不过,对于您手头的问题,CachingSagaStore 对 Saga 使用 Entry&lt;S&gt;,对关联使用 Set&lt;String&gt;。让我也将其添加到我的答案中。
    • 所以这意味着映射(keyType/valueType)应该是 String/MySaga(对于 sagaEhcache)和 String/String(对于 sagaAssocEhcache)?
    • 对不起,不够具体。我相信这是正确的@sodomark。不过老实说,我最近没有为 Sagas 设置缓存,所以我对这件事的了解有点少。因此,为什么我提到“代码的作用”。但是,我假设 { String - MySaga } 和 { String - String} 分别是 Saga 和 Association Value 缓存时应该采用的方式。
    • 经过更多研究后,映射似乎应该是 String/Entry 和 String/Set。但是因为我需要将缓存存储在堆外,所以我需要它们可序列化,因此映射应该更改为 String/CacheEntry 和 String/HashSet。现在的问题是 CacheEntry 类(CachingSagaStore 的内部类)是私有的。另外,您是否有 EhCache 版本 2 实现示例的链接?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多