亲测。
请将第一点看清楚,很多文章没有说明这个。其实我之前发过一次了,后来发现别人都没有说明,我就怀疑是不是我弄错了,怕误人子弟,就删了。
继续测试,最终发现。。。。没提到这个的才是误人子弟。。。。
先不说怎么做,咱们先说说用的过程中的感受:
1、第一个特别需要强调的是,这个只适合同一台机器上的tomcat,而且要项目名称一致。这个两个条件,缺一不可。
请看清上面这个看的不太清楚的文字。非常重要。
没错,你没看错。
我一开始,做测试的时候,是写在本地的我发现,good,session一致,后来放到两台机器上,就不行了。再往深了测,发现,同一台机器上的两个tomcat的两个不同项目,也不行。
这种方式实际上就是组播模式。
tomcat间是以IP组播发送变更的数据,将数据发送到集群组的其他成员。这个IP就是那个228.0.0.4。
看到这,你肯定和我的想法一样,这个TMD还能用?
2、其实这个也是有场景可以使用的:客户不给你加机器的时候,这个场景用这个自带的就很好用,实现起来简单。
具体的实现步骤就两步:
1、在tomcat的server.xml 文件中找到 <Engine name="Catalina" defaultHost="localhost"> 标签
在这个标签下面加入下面内容,不要改动:
- <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
- channelSendOptions="8">
- <Manager className="org.apache.catalina.ha.session.DeltaManager"
- expireSessionsOnShutdown="false"
- notifyListenersOnReplication="true"/>
- <Channel className="org.apache.catalina.tribes.group.GroupChannel">
- <Membership className="org.apache.catalina.tribes.membership.McastService"
- address="228.0.0.4"
- port="45564"
- frequency="500"
- dropTime="3000"/>
- <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
- address="auto"
- port="4000"
- autoBind="100"
- selectorTimeout="5000"
- maxThreads="6"/>
- <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="/tmp/war-temp/"
- deployDir="/tmp/war-deploy/"
- watchDir="/tmp/war-listen/"
- watchEnabled="false"/>
- <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
- <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
- </Cluster>
2、web项目的web.xml文件中加入 <distributable/> 标签;
这个标签必须要有。
3、验证:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <base href="<%=basePath%>">
- <title>My JSP 'index.jsp' starting page</title>
- <meta http-equiv="pragma" content="no-cache">
- <meta http-equiv="cache-control" content="no-cache">
- <meta http-equiv="expires" content="0">
- <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
- <meta http-equiv="description" content="This is my page">
- <!--
- <link rel="stylesheet" type="text/css" href="styles.css">
- -->
- </head>
- <body>
- SessionID:<%=session.getId()%>
- <BR>
- SessionIP:<%=request.getServerName()%>
- <BR>
- SessionPort:<%=request.getServerPort()%>
- <%
- out.println("This is Tomcat Server 11111");
- %>
- </body>
- </html>
你会发现,sessionId是一致的。