1

我们有在 Tomcat 上运行的网站。其中一些是集群的(通常是集群中的两个节点),并且一切正常。

但是,我们有一对会话未正确复制,即使配置看起来与我们的其他(工作)安装相似。

当我通过 JMX 检查 Tomcat 节点时,我看到工作和非工作站点的 Cluster.modelerType 都设置为 org.apache.catalina.ha.tcp.SimpleTcpCluster。

但是,当我查看 Manager 时,我看到为工作节点加载了 DeltaManager,但为不工作的节点加载了 StandardManager。

web.xml 确实设置了“<distributable/>”。此外,“<manager/>”在 context.xml 中被注释掉。所以,这两个不是问题。

这是 server.xml 的一个片段(Tomcat 7.0.42)

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
   <Channel className="org.apache.catalina.tribes.group.GroupChannel">
     <Membership className="org.apache.catalina.tribes.membership.McastService"
      address="228.0.3.4"
      port="23810"
      frequency="500"
      dropTime="3000" 
     />
     <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"    
            address="192.168.1.144"
     />    
   </Channel>
</Cluster> 

任何想法配置的哪一部分可能导致 SimpleTcpCluster 处于活动状态,但 StandardManager 正在使用中?

4

2 回答 2

1

这是创建管理器的 StandardContext 中的代码(取自 Tomcat 8,但对于许多版本并没有真正改变)

// Acquire clustered manager
Manager contextManager = null;
Manager manager = getManager();
if (manager == null) {
    if (log.isDebugEnabled()) {
        log.debug(sm.getString("standardContext.cluster.noManager",
                Boolean.valueOf((getCluster() != null)),
                Boolean.valueOf(distributable)));
    }
    if ( (getCluster() != null) && distributable) {
        try {
            contextManager = getCluster().createManager(getName());
        } catch (Exception ex) {
            log.error("standardContext.clusterFail", ex);
            ok = false;
        }
    } else {
        contextManager = new StandardManager();
    }
}

看起来你已经检查了正确的事情。此时,我会将我的 IDE 连接到 Tomcat 实例并使用远程调试来逐步执行这部分代码,以找出使用错误管理器的原因。

于 2013-10-26T13:07:10.400 回答
0

事实证明,修复它的原因是在我们的 web.xml 文件中添加了 metadata-complete="true"。

这似乎在我们的 servlet 规范设置为 3.0 的站点上是必需的(不是 reqd. on 2.5)

没有这个,正在加载的东西(我猜来自我们使用的一些 3rd 方 jar)可能正在取消“可分发”。事实证明,我们使用的第 3 方库之一包含一个 web-tag 片段,但也没有说它是“可分发的”,那么整个应用程序不是。

Servlet 规范 3.0,第 8.2.3 节,5.g.ix 说:只有当它的所有 web 片段也被标记时,合并产生的 web.xml 才被认为是 <distributable>。 小服务程序规范 3.1

于 2013-10-28T13:29:04.857 回答