首页 > 解决方案 > 向 infinispan 缓存添加数据时出现 ISPN000217

问题描述

我有一个应用程序在 2 个集群内的 4 个节点上运行。该应用程序使用 infinispan 和 SpringEmbeddedCacheManager 配置了缓存。我在尝试将数据添加到缓存时遇到间歇性问题,请注意我正在将数据添加为键值对,其中我的值将始终是自定义类创建的。

我只是尝试将缓存类型更改为已复制、本地和无效,我观察到使用本地或无效缓存时没有问题。任何人都可以确认分布式缓存中的大对象是否会导致任何问题。

Infinispan 配置

<distributed-cache name="apigw-access-cache" owners="1" segments="20" mode="SYNC" statistics="false">
    <eviction max-entries="10" strategy="LIRS"/>
    <expiration max-idle="360000" lifespan="3600000"/>
</distributed-cache>

英菲尼斯版

   <dependency>
            <groupId>org.infinispan</groupId>
            <artifactId>infinispan-spring4</artifactId>
            <version>7.0.3.Final</version><!--$NO-MVN-MAN-VER$ -->
        </dependency>

        <dependency>
            <groupId>org.infinispan</groupId>
            <artifactId>infinispan-cli-server</artifactId>
            <version>7.0.0.CR1</version>
        </dependency>

错误

2019-12-04 09:44:23.361 [qtp1933072581-15447] ERROR o.i.i.InvocationContextInterceptor - ISPN000136: Execution error
org.infinispan.remoting.RemoteException: ISPN000217: Received exception from node-10097-32028, see cause for remote stack trace
    at org.infinispan.remoting.transport.AbstractTransport.checkResponse(AbstractTransport.java:44) ~[infinispan-core-7.0.3.Final.jar!/:7.0.3.Final]
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.processSingleCall(CommandAwareRpcDispatcher.java:381) ~[infinispan-core-7.0.3.Final.jar!/:7.0.3.Final]
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:167) ~[infinispan-core-7.0.3.Final.jar!/:7.0.3.Final]
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.invokeRemotely(JGroupsTransport.java:560) ~[infinispan-core-7.0.3.Final.jar!/:7.0.3.Final]
    at org.infinispan.remoting.rpc.RpcManagerImpl.invokeRemotely(RpcManagerImpl.java:290) ~[infinispan-core-7.0.3.Final.jar!/:7.0.3.Final]

Caused by: java.lang.IllegalArgumentException: Can not set java.util.Set field Class.field to java.lang.String
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) ~[na:1.8.0_121]
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) ~[na:1.8.0_121]
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) ~[na:1.8.0_121]
    at java.lang.reflect.Field.set(Field.java:764) ~[na:1.8.0_121]
Caused by: org.infinispan.commons.CacheException: Problems invoking command.
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.handle(CommandAwareRpcDispatcher.java:221)
    at org.jgroups.blocks.RequestCorrelator.handleRequest(RequestCorrelator.java:460)
    at org.jgroups.blocks.RequestCorrelator.receiveMessage(RequestCorrelator.java:377)

Caused by: org.infinispan.commons.CacheException: Problems invoking command.
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.handle(CommandAwareRpcDispatcher.java:221) ~[infinispan-core-7.0.3.Final.jar!/:7.0.3.Final]
    at org.jgroups.blocks.RequestCorrelator.handleRequest(RequestCorrelator.java:460) ~[jgroups-3.6.1.Final.jar!/:3.6.1.Final]
    at org.jgroups.blocks.RequestCorrelator.receiveMessage(RequestCorrelator.java:377) ~[jgroups-3.6.1.Final.jar!/:3.6.1.Final]

标签: spring-bootinfinispanjgroups

解决方案


首先,你不应该使用这么旧的 Infinispan 版本,你应该升级到 9.4.17.Final

堆栈跟踪片段的顺序似乎不正确,但这Can not set java.util.Set field Class.field to java.lang.String是因为您的两个节点具有同一类的不同版本。

分布式缓存和失效缓存的最大区别在于分布式缓存将值复制到其他节点,而失效缓存发送的失效消息仅包含密钥。如果失效缓存有效,那么问题几乎可以肯定是您的值类之一已更改,并且其中一个节点仍然具有旧版本。


推荐阅读