Java 严重:管理器[localhost#/]:无法通过TCP通道接收消息

Java 严重:管理器[localhost#/]:无法通过TCP通道接收消息,java,tomcat,tomcat6,liferay,Java,Tomcat,Tomcat6,Liferay,我目前正在建立Tomcat6集群环境liferay 6.0.6。 具有会话复制的4个节点。没有棘手的会议 因此,根据本网站提供的指南,我做了以下工作: 添加了webapps/conf/context.xml: webapps/ROOT/WEB-INF/WEB.xml添加到:文件顶部,第一个括号之后。 我还向所有自定义portlet web.xml添加了distributable。 在setenv.sh中:-Djava.net.preferipv6address=false-Djava.net.p

我目前正在建立Tomcat6集群环境liferay 6.0.6。 具有会话复制的4个节点。没有棘手的会议

因此,根据本网站提供的指南,我做了以下工作:

添加了webapps/conf/context.xml: webapps/ROOT/WEB-INF/WEB.xml添加到:文件顶部,第一个括号之后。 我还向所有自定义portlet web.xml添加了distributable。 在setenv.sh中:-Djava.net.preferipv6address=false-Djava.net.preferIPv4Stack=true

在webapps/conf/server.xml中

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatA" />
我的liferay-ext.properties:

cluster.link.autodetect.address=www.google.com:80
lucene.replicate.write=true
cluster.link.enabled=true

net.sf.ehcache.configurationResourceName=/cache/hibernate-clustered.xml
ehcache.multi.vm.config.location=/cache/liferay-multi-vm-clustered.xml
我还在所有节点上创建了一个jsp

<td>
  Session ID</td>
<td><%= session.getId() %></td>
<% session.setAttribute("abc","abc"); %>
</tr>
<tr>
<td>
  Created on</td>
  <td><%= new java.util.Date(session.getCreationTime()).toString() %></td>
</tr>
</table>
</body>
</html>

会话ID
创建于
使用同一个用户,我可以切换服务器,会话似乎可以毫无问题地复制。但是,当我在liferay中修改某些内容时,仍然会得到stacktrace

我已经被困了一段时间了。 我们已检查所有服务器和JVM时间是否与NTP服务器正确同步。 没有端口被阻塞。服务器无法访问internet。 它们都在虚拟机上运行

有人知道我做错了什么吗

谢谢。

几句话

1.)您报告的问题可能与channelSendOptions使用的值有关

严重:管理器[localhost#/]:无法通过TCP接收消息 通道java.lang.IllegalStateException:setAttribute:会话已存在 无效

当前配置将channelSendOptions设置为8。这意味着在节点之间发送的消息是异步发送的。这对于速度来说是非常好的,但是,这意味着数据可能会无序到达[1]

错误消息表示它收到了更新会话属性的消息,但是要更新的会话已经无效(即已删除)。出现此错误的一个常见原因是消息接收顺序错误

在大多数情况下,可以通过将channelSendOptions的值设置为6来纠正此问题。这将同步发送消息,从而保证顺序

[1] -

2.)另一种可能性(尽管可能性较小)是您在Tomcat中遇到了一个bug。您还没有列出您正在使用的Tomcat的具体版本,但是升级到最新的Tomcat 6.0.x版本也是一个好主意

3.)您指出“没有粘性会话,无法复制会话”。这是不正确的。会话复制和会话粘性是两个独立的过程。虽然它们经常一起使用,但会话复制不需要粘性会话,粘性会话也不需要会话复制

会话复制(Tomcat称为“集群”)是跨多个Tomcat服务器复制会话数据的过程。当跨多个节点复制会话数据时,用户的请求发送到哪个节点并不重要,因为它们都具有相同的会话数据

会话“粘性”由负载平衡器执行,它是负载平衡器确保一个会话始终指向同一后端Tomcat服务器的过程

例如,负载平衡器将请求定向到Tomcat服务器a,该请求将导致创建会话。启用会话粘性后,负载平衡器将向Tomcat服务器A发送每个具有相同会话id的附加请求。没有会话或具有不同会话的其他请求将继续正常进行负载平衡

像巧克力和花生酱一样,粘性会话和会话复制通常一起使用,但这不是必需的。基本负载平衡只能通过粘性会话执行,但是如果后端Tomcat节点出现故障,用户将丢失会话数据。对于会话复制和粘性会话,用户不会受到其中一个后端Tomcat节点故障的影响。负载平衡器将自动将它们路由到另一个节点,该节点将具有用户会话数据的副本

cluster.link.autodetect.address=www.google.com:80
lucene.replicate.write=true
cluster.link.enabled=true

net.sf.ehcache.configurationResourceName=/cache/hibernate-clustered.xml
ehcache.multi.vm.config.location=/cache/liferay-multi-vm-clustered.xml
<td>
  Session ID</td>
<td><%= session.getId() %></td>
<% session.setAttribute("abc","abc"); %>
</tr>
<tr>
<td>
  Created on</td>
  <td><%= new java.util.Date(session.getCreationTime()).toString() %></td>
</tr>
</table>
</body>
</html>