Java 集群节点上的Tomcat会话复制问题
配置: 我的tomcat集群上有2台服务器,配置为复制会话。在这两个实例的日志中,我经常看到以下日志:Java 集群节点上的Tomcat会话复制问题,java,tomcat,jmeter,tomcat7,Java,Tomcat,Jmeter,Tomcat7,配置: 我的tomcat集群上有2台服务器,配置为复制会话。在这两个实例的日志中,我经常看到以下日志: SEVERE: Unable to perform replication request. java.util.ConcurrentModificationException at java.util.ArrayList.writeObject(ArrayList.java:746) at sun.reflect.GeneratedMethodAccessor726.invo
SEVERE: Unable to perform replication request.
java.util.ConcurrentModificationException
at java.util.ArrayList.writeObject(ArrayList.java:746)
at sun.reflect.GeneratedMethodAccessor726.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
at org.apache.catalina.ha.session.DeltaRequest$AttributeInfo.writeExternal(DeltaRequest.java:392)
at org.apache.catalina.ha.session.DeltaRequest.writeExternal(DeltaRequest.java:285)
at org.apache.catalina.ha.session.DeltaRequest.serialize(DeltaRequest.java:299)
at org.apache.catalina.ha.session.DeltaManager.serializeDeltaRequest(DeltaManager.java:621)
at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:1053)
at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:1018)
at org.apache.catalina.ha.tcp.ReplicationValve.send(ReplicationValve.java:537)
at org.apache.catalina.ha.tcp.ReplicationValve.sendMessage(ReplicationValve.java:524)
at org.apache.catalina.ha.tcp.ReplicationValve.sendSessionReplicationMessage(ReplicationValve.java:506)
at org.apache.catalina.ha.tcp.ReplicationValve.sendReplicationMessage(ReplicationValve.java:419)
at org.apache.catalina.ha.tcp.ReplicationValve.invoke(ReplicationValve.java:343)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
关于例外情况的任何想法/信息。它们无害吗?它们是否与正在使用的内存相关
群集配置:
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="4">
<Manager className="org.apache.catalina.ha.session.DeltaManager"
expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
<Member className="org.apache.catalina.tribes.membership.StaticMember"
port="8083"
securePort="-1"
host="IP-ADDR"
domain="XXX.com"
uniqueId=""/>
</Interceptor>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address=""
port="8083"
autoBind="100"
selectorTimeout="5000"
maxThreads="100"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve"filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir=""
deployDir=""
watchDir=""
watchEnabled="false"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
提前感谢。负载平衡器是否设置为stickysessions模式?对我来说,存在并发访问eroor,所以复制与会话修改冲突。即使存在会话复制,您也需要使用stickysession以确保用户使用最新的会话。感谢@Mr_Thorynque提供的信息,没有为我的Loadbalancer配置StickySessions。但是tomcat的这种行为已经存在一段时间了,之前没有这样的日志。(Tomcat版本7.0.52)。可能您的服务器上有更多的活动,因此在复制和会话修改之间会有冲突。尝试启用粘性会话,并查看是否会追加此错误。