Announcement

Collapse
No announcement yet.

Tomca5 und Session Replication

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tomca5 und Session Replication

    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:
    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");
    Objekt:
    Code:
    public class SessionTest implements Serializable {
        
        public int i = 0;
        
        /**
         * 
         */
        public SessionTest() { 
        }
    
        public void incremend(){ 
    	this.i++;
    	
        }
        
        public int getI() {
    	return this.i;
        }
    }
    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






    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.
    ~
    Zuletzt editiert von netwalker; 12.08.2008, 08:58.
Working...
X