同一服务器无法运行两个使用本地Infinispan容器的独立实例
这个问题的核心在于:即使你以为用的是"本地"Infinispan缓存容器,默认配置下它依然会启动JGroups用于节点发现,两个实例会抢占同一个默认JGroups端口,且这个端口没有关联到JBoss的jboss.socket.binding.port-offset配置,最终导致冲突。
下面是几个可行的解决方案,按推荐程度排序:
1. 让Infinispan绑定到JBoss的Socket Binding,继承port-offset
修改你的standalone.xml配置,显式将Infinispan的传输层关联到JBoss的socket binding组,这样端口偏移会自动生效:
<subsystem xmlns="urn:jboss:domain:infinispan:12.0"> <cache-container name="default" default-cache="local" module="org.wildfly.clustering.web.infinispan"> <!-- 添加这行,关联到JBoss的jgroups-tcp socket binding --> <transport socket-binding="jgroups-tcp" /> <local-cache name="local"> <locking isolation="REPEATABLE_READ" /> </local-cache> </cache-container> </subsystem>
然后确认你的socket binding组里有jgroups-tcp的默认配置:
<socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}"> <socket-binding name="jgroups-tcp" port="7600" /> </socket-binding-group>
现在启动第二个实例时加上-Djboss.socket.binding.port-offset=100,它的JGroups端口就会自动变成7700,不会和第一个实例冲突。
2. 完全禁用JGroups,使用纯本地缓存
如果你的场景完全不需要集群功能,可以直接配置Infinispan为纯本地模式,彻底避免JGroups启动:
修改standalone.xml中的Infinispan子系统,移除传输层配置,并确保默认缓存是本地缓存:
<subsystem xmlns="urn:jboss:domain:infinispan:12.0"> <cache-container name="default" default-cache="local" module="org.wildfly.clustering.web.infinispan"> <!-- 移除任何<transport>相关配置 --> <local-cache name="local"> <locking isolation="REPEATABLE_READ" /> <transaction mode="NON_XA" /> </local-cache> </cache-container> </subsystem>
这样配置后,Infinispan不会启动JGroups进程,自然也不会有端口冲突的问题。
3. 为每个实例指定独立的JGroups配置文件
如果不想修改默认配置,可以在启动实例时指定自定义的JGroups配置文件,每个实例用不同的端口:
比如创建两个JGroups配置文件jgroups-instance1.xml和jgroups-instance2.xml,分别设置不同的TCP端口:
<!-- jgroups-instance1.xml --> <TCP bind_port="7600" />
<!-- jgroups-instance2.xml --> <TCP bind_port="7700" />
然后启动实例时分别指定:
# 实例1启动命令 ./standalone.sh -Djgroups.config=file:/path/to/jgroups-instance1.xml # 实例2启动命令 ./standalone.sh -Djgroups.config=file:/path/to/jgroups-instance2.xml
为什么默认情况下port-offset不生效?
因为默认的Infinispan配置没有关联到JBoss的socket binding,而是直接使用JGroups的默认硬编码端口,所以jboss.socket.binding.port-offset的偏移规则不会自动应用到JGroups端口上。必须显式关联socket binding,或者手动指定JGroups端口才能解决这个问题。
内容的提问来源于stack exchange,提问作者Jan-Willem Gmelig Meyling

