部署在外部Tomcat10上的Spring Boot 3会话集群错误

问题描述 投票:0回答:1

我使用 Spring Boot 3.x 和外部 Tomcat 10。 在外部 Tomcat 上设置会话集群 如果我检查jsp页面,会话是共享的,但是 如果我使用 Spring Boot 服务检查相同的逻辑,则会话不会被共享。 如果我用jsp检查,它似乎是共享的,因此外部Tomcat之间的会话集群是不可能的。 看起来好像设置好了,但是为什么在Spring Boot中不能共享呢? SpringBootServletInitializer已经实现了。

我正在 Windows 上本地使用两个不同的 Tomcat 端口进行测试。 Distributable="true" 在 Context 中设置。

@GetMapping("/session-test")
public String sessionTest(HttpSession session, Model model) {

   log.info("sessionTest  enter ");

    String sessionId = session.getId();
    Integer counter = (Integer) session.getAttribute("counter");
    if (counter == null) {
        counter = 1;
    } else {
        counter++;
    }
    session.setAttribute("counter", counter);

    model.addAttribute("sessionId", sessionId);
    model.addAttribute("counter", counter);

    return "web/sessionTest"; 
}

两个 Spring Boot 服务器希望共享它们的会话...

1 的服务器.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
      
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
            <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                
                <Receiver 
                    address="127.0.0.1" 
                    port="3200" 
                    autoBind="100" 
                    selectorTimeout="5000"
                    maxThreads="6" 
                    className="org.apache.catalina.tribes.transport.nio.NioReceiver"/>

                <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.TcpPingInterceptor"/>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
                
                
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
                    <Member className="org.apache.catalina.tribes.membership.StaticMember" 
                            host="127.0.0.1" 
                            port="3201" 
                            uniqueId="{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}"/>
                </Interceptor>

                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
            </Channel>

            <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"/>
            <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    <Context path="" docBase="ROOT" distributable="true"/>
    <!-- SingleSignOn valve, share authentication between web applications
         Documentation at: /docs/config/valve.html -->
    <!--
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
    -->

    <!-- Access log processes all example.
         Documentation at: /docs/config/valve.html
         Note: The pattern used is equivalent to using pattern="common" -->
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

  </Host>

2 的server.xml

    <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
        <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster">
            <Channel className="org.apache.catalina.tribes.group.GroupChannel">
                
                <Receiver 
                    address="127.0.0.1" 
                    port="3201" 
                    autoBind="100" 
                    selectorTimeout="5000"
                    maxThreads="6" 
                    className="org.apache.catalina.tribes.transport.nio.NioReceiver"/>

                <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.TcpPingInterceptor"/>
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
                
                
                <Interceptor className="org.apache.catalina.tribes.group.interceptors.StaticMembershipInterceptor">
                    <Member className="org.apache.catalina.tribes.membership.StaticMember" 
                            host="127.0.0.1" 
                            port="3200" 
                            uniqueId="{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,17}"/>
                </Interceptor>

                <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
            </Channel>

            <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"/>
            <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
        
        <Host name="localhost"  appBase="webapps"  unpackWARs="true" autoDeploy="true">
        <Context path="" docBase="ROOT" distributable="true"/>
spring tomcat cluster-analysis external boot
1个回答
0
投票

我是这样处理的...... 我不知道为什么我必须这样做。

<Context>
    <Manager className="org.apache.catalina.ha.session.DeltaManager"/>
</Context>
© www.soinside.com 2019 - 2024. All rights reserved.