Hallo,
Seit gut drei Tagen bin ich dran den Fehler zu finden, warum mein kleines Test-Tool im Cluster mit Session Replication nicht richtig funktioniert. Leider muss ich sagen, das ich es einfach nicht weis.
Zu mein Problem. Mein Test-Tool, das aus zwei Klasse besteht hat die Funktion um zu sehen, ob mein Cluster und die Session Replikation richtig funktioniert. Zu mein bedauern muss ich sagen, funktioniert es nur zu teils. Das Test-Tool erzeugt ein Objekt das Serialisierbar ist, nur wenn dies nicht in der Session existiert. Existiert Sie bereits in der Session, so wird das Objekt aus der Session geholt. Als nächtes wird eine Methode in diesem Objekt aufgerufen, was eine Variable ( i ) um eins erhöht. Das geänderte Objekt wird nicht mit session.setAttribute zurück geschrieben, da ich useDirtyFlag deaktiviert habe.
Servlet:
Objekt:
Wie man sieht, ist die Methode / Klasse einfach gehalten. Das Problem ist nun, wenn man auf die Seite geht sieht man zwei Zahlen. Die erste Zahl ist Zahl aus dem Objekt und die zweite Zahl aus der Session ( session.getAttribute("VALUE") ).
Wenn man nun jetzt die Seite neu läd, wird diese Zahl erhöht bis zu einer bestimmten zahl, dann plötzlich wird das Objekt nicht mehr repliziert und man hat die Zahl doppelt oder ein Server hat im Objekt die 10 steht und auf dem anderen Server die 15....
Ich hoffe, ich konnte mein Problem irgendwie näher bringen. Seit gestern weis ich nicht was ich noch ausprobieren soll und währe für tipps und hilfestellungen dankbar.
mfg
netwalker
Worker-File:
Seit gut drei Tagen bin ich dran den Fehler zu finden, warum mein kleines Test-Tool im Cluster mit Session Replication nicht richtig funktioniert. Leider muss ich sagen, das ich es einfach nicht weis.
Zu mein Problem. Mein Test-Tool, das aus zwei Klasse besteht hat die Funktion um zu sehen, ob mein Cluster und die Session Replikation richtig funktioniert. Zu mein bedauern muss ich sagen, funktioniert es nur zu teils. Das Test-Tool erzeugt ein Objekt das Serialisierbar ist, nur wenn dies nicht in der Session existiert. Existiert Sie bereits in der Session, so wird das Objekt aus der Session geholt. Als nächtes wird eine Methode in diesem Objekt aufgerufen, was eine Variable ( i ) um eins erhöht. Das geänderte Objekt wird nicht mit session.setAttribute zurück geschrieben, da ich useDirtyFlag deaktiviert habe.
Servlet:
Code:
HttpSession session = req.getSession(); String SessionId = "----------------- SessionID: "+session.getId()+ " -----------------"; System.out.println(SessionId); SessionTest sTest=null; if (session.getAttribute(SESSION_NAME)==null) { sTest = new SessionTest(); session.setAttribute(SESSION_NAME, sTest); }else { sTest = (SessionTest)session.getAttribute(SESSION_NAME); } String inet = "----------------- "+InetAddress.getLocalHost().getHostName()+" -----------------"; System.out.println(inet); sTest.incremend(); session.setAttribute(VALUE, new Integer(sTest.getI())); System.out.println("i --> "+sTest.getI()); res.getOutputStream().print(SessionId+"\n"); res.getOutputStream().print(inet+"\n"); res.getOutputStream().print(sTest.getI()+"/"+((Integer)session.getAttribute(VALUE)).intValue()+"\n");
Code:
public class SessionTest implements Serializable { public int i = 0; /** * */ public SessionTest() { } public void incremend(){ this.i++; } public int getI() { return this.i; } }
Wenn man nun jetzt die Seite neu läd, wird diese Zahl erhöht bis zu einer bestimmten zahl, dann plötzlich wird das Objekt nicht mehr repliziert und man hat die Zahl doppelt oder ein Server hat im Objekt die 10 steht und auf dem anderen Server die 15....
Ich hoffe, ich konnte mein Problem irgendwie näher bringen. Seit gestern weis ich nicht was ich noch ausprobieren soll und währe für tipps und hilfestellungen dankbar.
mfg
netwalker
Code:
ServerXML: <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster" managerClassName="org.apache.catalina.cluster.session.DeltaManager" expireSessionsOnShutdown="false" useDirtyFlag="false" debug="99" printToScreen="true" doClusterLog="true"> <Membership className="org.apache.catalina.cluster.mcast.McastService" mcastAddr="228.0.0.4" mcastPort="45564" mcastFrequency="500" mcastDropTime="3000"/> <Receiver className="org.apache.catalina.cluster.tcp.ReplicationListener" tcpListenAddress="192.168.51.22" tcpListenPort="4001" tcpSelectorTimeout="100" tcpThreadCount="8"/> <Sender className="org.apache.catalina.cluster.tcp.ReplicationTransmitter" replicationMode="pooled" doTransmitterProcessingStats="true" doProcessingStats="true" doWaitAckStats="true" queueTimeWait="true" queueDoStats="true" queueCheckLock="true" ackTimeout="15000" waitForAck="true" /> <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve" filter=".*\.gif;"/> <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener" /> <ClusterListener className="org.apache.catalina.cluster.session.JvmRouteSessionIDBinderListener" /> <ClusterListener className="org.apache.catalina.cluster.session.ClusterSessionListener"/> </Cluster>
Worker-File:
Code:
worker-file: worker.list=cluster1 worker.w1.type=ajp13 worker.w1.host=192.168.51.21 worker.w1.port=8009 worker.w1.lbfactor=1 worker.w1.local_worker=0 worker.w2.type=ajp13 worker.w2.host=192.168.51.22 worker.w2.port=8009 worker.w2.lbfactor=1 worker.w2.local_worker=0 worker.cluster1.type=lb worker.cluster1.sticky_session=JK_FALSE worker.cluster1.balanced_workers=w1,w2 worker.cluster1.local_worker_only=0 worker.cluster1.status.type=status worker.cluster1.method=B #And finally, we set the balance method to 'B' or balance by busy factor. Apache will delegate the next request to the Tomcat instance which is least busy. ~