1

Tomcat で実行されている Web サイトがあります。それらの一部はクラスター化され (通常はクラスター内の 2 つのノード)、すべて正常に動作します。

ただし、構成が他の (動作中の) インストールと似ているように見えても、セッションが正しく複製されていないペアが 1 つあります。

JMX 経由で Tomcat ノードを調べると、稼働中のサイトと稼働していないサイトの両方で Cluster.modelerType が org.apache.catalina.ha.tcp.SimpleTcpCluster に設定されていることがわかります。

しかし、Manager を見ると、動作しているノードには DeltaManager がロードされていますが、動作していないノードには StandardManager がロードされています。

web.xml には "<distributable/>" が設定されています。また、"<manager/>" は context.xml で COMMENTED になっています。したがって、これらの2つは問題ではありません。

これは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

これは Manager を作成する 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" を追加したことでした。

これは、サーブレット仕様が 3.0 に設定されているサイトでは必須のようです (2.5 では必須ではありません)。

これがないと、ロードされているもの (私たちが使用しているサードパーティの jar から推測しています) は、おそらく「配布可能」を元に戻しています。私たちが使用しているサードパーティ ライブラリの 1 つに Web タグ フラグメントが含まれていることが判明しましたが、それが「配布可能」であるとは言っていないため、アプリ全体は配布可能ではありません。

サーブレット仕様 3.0、セクション 8.2.3、5.g.ix は次のように述べています。マージの結果として生じる web.xml は、そのすべての Web フラグメントも同様にマークされている場合にのみ、<配布可能> と見なされます。 サーブレット仕様 3.1

于 2013-10-28T13:29:04.857 に答える