在我们的应用程序中,我们将数据缓存在本地 infinispan 缓存中。缓存的数据是从数据库中加载的。
现在我们正在使用 Wildfly(25.0.1-Final 和 Wildfly 包含的默认 infinispan)在集群环境中运行进行调整。
通信栈(tcp/jgroups/tcp_ping)正在工作,节点可以看到对方。正常缓存已正确更新所有节点:
my-cluster-1 | 17:38:03,599 INFO [org.infinispan.CLUSTER] (thread-9,ejb,my-cluster-1)
[Context=my.ear/web.war#my.my.core.model.i18n.Language]
ISPN100008: Updating cache members list [my-cluster-1, my-cluster-2], topology id 3
my-cluster-1 | 17:38:03,627 INFO [org.infinispan.CLUSTER] (thread-9,ejb,my-cluster-1)
[Context=my.ear/web.war#my.my.core.model.base.ComplexEntity.collectionToCEs]
ISPN100008: Updating cache members list [my-cluster-1, my-cluster-2], topology id 3
my-cluster-1 | 17:38:03,664 INFO [org.infinispan.CLUSTER] (thread-9,ejb,my-cluster-1)
[Context=my.ear/web.war#my.my.core.model.base.ComplexTypeEntity]
ISPN100008: Updating cache members list [my-cluster-1, my-cluster-2], topology id 3
现在我们想把infinispan本地缓存改成失效缓存,当任何节点上的数据发生变化时,通知所有节点刷新缓存数据。
根据文档: https://dzone.com/refcardz/getting-started-infinispan
失效缓存是一种特殊类型的集群缓存,不共享任何数据:当节点修改/删除条目时,仅将失效消息发送给集群中的其他成员,从而避免陈旧数据。
我知道没有数据共享,只发送无效消息。
这是我们在
standalone.xml
中的缓存容器配置:
<subsystem xmlns="urn:jboss:domain:infinispan:13.0">
<cache-container name="mc" marshaller="PROTOSTREAM">
<transport lock-timeout="60000"/>
</cache-container>
我们正在获取嵌入式缓存管理器,如下所示:
@Resource(lookup = "java:jboss/infinispan/container/mc") //
private EmbeddedCacheManager defaultCacheManager;
并将它与缓存构建器一起使用以在我们的代码中创建缓存(本地或分布式作为无效异步):
var builder = new ConfigurationBuilder();
if (dist) //different config for invalidation cache
builder
.clustering().cacheMode( CacheMode.INVALIDATION_ASYNC )
.memory().storage( StorageType.HEAP)
.encoding().mediaType("application/x-protostream");
else //default, local cache
builder
.clustering().cacheMode( CacheMode.LOCAL);
defaultCacheManager.defineConfiguration( cacheName, builder.build());
关于 XML 和缓存构建器中的配置:我们今天添加了 PROTOSTREAM、编码和内存设置,在关于编组器的初始错误之后,但它们没有帮助。
当我们启动 Wildlfy 集群时,我们在 server.log 中收到此错误
ISPN000615: Unable to unmarshall 'java.util.LinkedHashMap' as a marshaller is not present in the user or global SerializationContext"}}
,系统无法启动:
my-cluster-2 | Caused by: org.jboss.weld.exceptions.WeldException: WELD-000049:
Unable to invoke protected void my.service.index.IndexConfig.init() on indexconfig
my-cluster-2 | Caused by: java.lang.reflect.InvocationTargetException
my-cluster-2 | Caused by: org.infinispan.commons.marshall.MarshallingException:
ISPN000615: Unable to unmarshall 'java.util.LinkedHashMap' as a marshaller is not present
in the user or global SerializationContext"}}
我知道 infinispan 无法解组链接的哈希映射,但我的理解是缓存的数据保留在本地,只有无效通过网络发送。在此更改之前,相同的设置适用于本地缓存。除了编写我们自己的编组器之外,有什么方法可以解决无效缓存的这个问题吗?