4.4 修改server.xml文件

修改位于%Tomcat1_Home%\conf目录下的server.xml配置文件,将<Engine name="Catalina" defaultHost="localhost">修改为<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">此处“jvmRoute”赋得值为workers.properties文件中的server名,并在其后添加如下内容(这段内容可在可在%Tomcat1_Home%\webapps\docs目录中的cluster-howto.html文件中找到):

<ClusterclassName="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>

将修改好server.xml文件复制一份到%Tomcat2_Home%\conf目录下,这里是在一台电脑上安装两个tomcat,应该修改tomcat2的一些监听端口号,以避免冲突,修改时注意不要与服务器上其它应用的端口冲突(这里是在文本编辑器中将server.xml文件中所有数字8修改为9)。注意:在将ajp13协议的端口号默认值8009修改为9009时,要与workers.properties文件内worker.tomcat2.port=9009一致,并将

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">

处的tomcat2修改为tomcat1,将

<Receiver className="org.apache.catalina.tribes.transport.nio.

NioReceiver" address="auto" port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6" />

处的4000改为4001,其余不变。

4.5 编写jsp页面测试

%Tomcat1_Home%\webapps\目录下创建web项目,命名为test,在test文件夹下创建index.jsp文件,输入如下内容:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Insert title here</title>

</head>

<body>

<%

System.out.println("Hello!");

%>

</body>

</html>

将创建好的web项目拷贝一份到%Tomcat2_Home%\webapps目录下。依次启动Apachetomcat1tomcat2,通过浏览器访问http://localhost/index.jsp,可看到tomcat1窗口打印出Hello!,刷新一次,可看到tomcat2窗口也会打印出Hello!,再刷新一次,又会看到tomcat1窗口打印出Hello!,再刷新一次,又会看到tomcat2窗口打印出Hello!,这样重复下去,可发现请求会被tomcat1tomcat2轮流处理,实现了负载均衡。

5  Session复制

 

上述只配置了负载均衡,还要实现session复制,即任何一个tomcatsession可复制到另一个tomcat,集群内的tomcat具有共同的session

5.1 修改workers.properties文件

修改上述workers.properties文件,在其末尾添加一段内容:

设置用于负载均衡的serversession可否共享

worker.controler.sticky_session=1

5.2 添加测试页面test.jsp

在上述web项目中添加test.jsp(与index.jsp同目录)页面,内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8" import="java.util.*"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Cluster Test</title>

</head>

<body>

Server Info:<%

out.println(request.getLocalAddr() + " : "

+ request.getLocalPort() + " <br /> ");

%>

<%

out.println("<br>ID" + session.getId() + "</br> ");

// 如果有新的请求,则添加session属性

String dataName = request.getParameter("dataName");

if (dataName != null && dataName.length() > 0) {

String dataValue = request.getParameter("dataValue");

session.setAttribute(dataName, dataValue);

}

out.print("<br>Session 列表</br>");

Enumeration e = session.getAttributeNames();

while (e.hasMoreElements()) {

String name = (String) e.nextElement();

String value = session.getAttribute(name).toString();

out.println(name + " = " + value + "<br />");

System.out.println(name + " = " + value);

}

%>

<form action="test.jsp" method="post">

名称:<input type="text" name="dataName" /> <br />

    值:<input type="text" name="dataValue"/> <br /

<input type="submit" value="提交" />

</form>

</body>

</html>

test文件夹下创建WEB-INF文件夹,在其下创建web.xml文件,输入以下内容:

<?xml version="1.0" encoding="UTF-8"?>

<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instancexmlns="http://java.sun.com/xml/ns/javaeexmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsdxsi:schemaLocation="http://java.sun.com/xml/ns/javaee ;http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd

id="WebApp_ID" version="2.5">

   <distributable />

</web-app>

上述步骤完成之后,依次启动Apachetomcat1tomcat2通过浏览器访问http://localhost/test/test.jsp显示如下界面:

 

图3 session复制测试页面(一)

图中SessionID的后缀“.tomcat1”表明该session来自tomcat1,在表格中填入数据并提交后,显示如下页面:

 

图4 session复制测试页面(二)

通过上图表明,来自tomcat1session已复制到tomcat2(因为第一次将请求发送给tomcat2本来是没有数据的,但这里读出了tomcat1session列表),重开一个浏览器访问上述地址,页面显示的是同一SessionID(不同的浏览器属于不同的Session会话,应该有不同的SessionID,说明session已存在于集群中的所有tomcat中,紧接着关闭tomcat1,模拟tomcat1宕机,刷新页面,tomcat2仍会打印出session列表。