spring-boot - 向 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]
解决方案
首先,你不应该使用这么旧的 Infinispan 版本,你应该升级到 9.4.17.Final
堆栈跟踪片段的顺序似乎不正确,但这Can not set java.util.Set field Class.field to java.lang.String
是因为您的两个节点具有同一类的不同版本。
分布式缓存和失效缓存的最大区别在于分布式缓存将值复制到其他节点,而失效缓存发送的失效消息仅包含密钥。如果失效缓存有效,那么问题几乎可以肯定是您的值类之一已更改,并且其中一个节点仍然具有旧版本。
推荐阅读
- java - 如何在 Spring Boot REST 中处理未知数量的 RequestParam?
- node.js - 重新启动应用程序 Heroku Node 服务器时 Swift 给 H13 “连接关闭而没有响应”
- c# - 根据方括号中的项目数将字符串拆分为多个字符串C#
- julia - 尝试编写一个 softmax 和 NNLib softmax 给出意外的输出
- c# - DotPulsar:如何设置消费者接收队列大小?
- java - 缺少要求 osgi.wiring.package;(&(osgi.wiring.package=org.osgi.framework)(version>=1.10.0)(!(version>=2.0.0)))
- php - 集合类型上的 Symfony 回调约束
- javascript - javascript中.has的对立面是什么?
- reactjs - React 脚本构建以错误状态 1 退出?
- android - java.lang.NoClassDefFoundError:无法初始化类 org.jetbrains.kotlin.com.intellij.pom.java.LanguageLevel