infinispan 失效缓存和 MarshallingException:ISPN000615

问题描述 投票:0回答:0

在我们的应用程序中,我们将数据缓存在本地 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 无法解组链接的哈希映射,但我的理解是缓存的数据保留在本地,只有无效通过网络发送。在此更改之前,相同的设置适用于本地缓存。除了编写我们自己的编组器之外,有什么方法可以解决无效缓存的这个问题吗?

caching wildfly infinispan jgroups
© www.soinside.com 2019 - 2024. All rights reserved.