Java 集群节点上的Tomcat会话复制问题

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

配置: 我的tomcat集群上有2台服务器,配置为复制会话。在这两个实例的日志中,我经常看到以下日志:

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)。可能您的服务器上有更多的活动,因此在复制和会话修改之间会有冲突。尝试启用粘性会话,并查看是否会追加此错误。