2014-02-13 11 views
5

Ich versuche, Sitzungsreplikation in liveray auf Tomcat ohne viel Glück zu ermöglichen. Ich habe einen kleinen Test geschrieben, um zu sehen, ob Sitzungen repliziert werden, und es funktioniert gut in einer separaten JSP-Datei, die ich unter webapps/examples platziert habe, aber wenn ich denselben Code in ein lferay-porlet eingib, sind nur die JSESSION korrekt.Liferay Clustersitzungsreplikation

HttpSession httpSession = request.getSession(); 
    String testTime = (String) httpSession.getAttribute("testTime"); 
    String before = testTime; 

    testTime = Long.toString(System.currentTimeMillis()); 
    httpSession.setAttribute("testTime", testTime); 

    String sessionid = httpSession.getId(); 
    System.out.println("JSESSIONID: "+sessionid); 
    System.out.println("TEST TIME WAS: "+before); 
    System.out.println("TEST TIME IS: "+testTime); 

Hat jemand eine Vorstellung davon, warum es nicht funktioniert in der Liferay-Portlet? Ich habe ausschüttbaren hinzugefügt Portlet/WEB-INF/web.xml

Edit 1: Versionen

liferay 6.1.1 
Tomcat 7.0.47 

Edit 2: Ich versuchte, einen weiteren Test.

HttpSession httpSession = request.getSession(); 
    String testTime = (String) httpSession.getAttribute("testTime"); 
    String before = testTime; 

    if(testTime == null) { 
     testTime = Long.toString(System.currentTimeMillis()); 
     httpSession.setAttribute("testTime", testTime); 
    } 

    String sessionid = httpSession.getId(); 
    System.out.println("JSESSIONID: "+sessionid); 
    System.out.println("TEST TIME WAS: "+before); 
    System.out.println("TEST TIME IS: "+testTime); 

diesmal setze ich nur die Variable, wenn es Null ist. Und es funktioniert wie erwartet in der JSP außerhalb des Lebens, aber innerhalb des Lebens, es geht so.

  1. erste Server die Anfrage bekommt null Ende setzt die Variable
  2. Wenn der andere Server wird die Anfrage auch null bekommt zu bekommen und setts die Variable
  3. Wenn der Server, der die erste Anforderung bekam versucht zu bekommen die Variable erhält den Wert vom zweiten Server. Jetzt wird es repliziert.

Es spielt keine Rolle, welcher Server bekommt die erste Anforderung ist es immer das gleiche Ergebnis ohnehin

bearbeiten 4. Clusterinfo

Knoten: 2 Load Balancer:

<Proxy balancer://mycluster> 
      BalancerMember ajp://node1:8009 route=tomcat1 loadfactor=1 
      BalancerMember ajp://node2:8009 route=tomcat2 loadfactor=1 

      Order Deny,Allow 
      Deny from none 
      Allow from all 

      ProxySet lbmethod=byrequests 
    </Proxy> 
    <Location /balancer-manager> 
      SetHandler balancer-manager 
      Order deny,allow 
      Allow from all 
    </Location> 

    ProxyPass /balancer-manager ! 
    ProxyPass/balancer://mycluster/ 

portal-ext.properties

cluster.link.enabled=true 
jdbc.default.driverClassName=com.mysql.jdbc.Driver 
jdbc.default.url=jdbc:mysql://dbserver:3306/lportal?autoReconnect&autoReconnectForPools;&useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false 
jdbc.default.username=u jdbc.default.password=p 

spring.configs=\ 
     META-INF/base-spring.xml,\ 
     \ 
     META-INF/hibernate-spring.xml,\ 
     META-INF/infrastructure-spring.xml,\ 
     META-INF/management-spring.xml,\ 
     \ 
     META-INF/util-spring.xml,\ 
     \ 
     META-INF/jpa-spring.xml,\ 
     \ 
     META-INF/executor-spring.xml,\ 
     \ 
     META-INF/audit-spring.xml,\ 
     META-INF/cluster-spring.xml,\ 
     META-INF/editor-spring.xml,\ 
     META-INF/jcr-spring.xml,\ 
     META-INF/ldap-spring.xml,\ 
     META-INF/messaging-core-spring.xml,\ 
     META-INF/messaging-misc-spring.xml,\ 
     META-INF/mobile-device-spring.xml,\ 
     META-INF/notifications-spring.xml,\ 
     META-INF/poller-spring.xml,\ 
     META-INF/rules-spring.xml,\ 
     META-INF/scheduler-spring.xml,\ 
     META-INF/scripting-spring.xml,\ 
     META-INF/search-spring.xml,\ 
     META-INF/workflow-spring.xml,\ 
     \ 
     META-INF/counter-spring.xml,\ 
     META-INF/mail-spring.xml,\ 
     META-INF/portal-spring.xml,\ 
     META-INF/portlet-container-spring.xml,\ 
     META-INF/staging-spring.xml,\ 
     META-INF/virtual-layouts-spring.xml,\ 
     \ 
     META-INF/dynamic-data-source-spring.xml,\ 
     #META-INF/shard-data-source-spring.xml,\ 
     #META-INF/memcached-spring.xml,\ 
     #META-INF/monitoring-spring.xml,\ 
     \ 
     META-INF/ext-spring.xml 
+0

Bitte geben Sie relevante Details Ihres Cluster-Setups an, z. portal-ext.properties-Datei, Ihre Cluster-Topologie usw. zu beginnen. –

Antwort

1

Wenn Sie eine ordnungsgemäße Sitzungsreplikation wünschen, sollten Sie das Portal sowie alle Plugins als distributable deklarieren. Der Grund ist, dass jeder eine separate Webanwendung ist.

Die Verwendung der Sitzungsreplikation erzeugt jedoch einen enormen Aufwand. Wenn Sie aus Leistungsgründen einen Cluster erstellen, werden Sie sofort von der zusätzlichen Leistung profitieren.

Der Standard-Ratschlag (ich weiß, du fragst nicht danach, aber ich würde es gerne hier sehen, damit andere später die Frage finden) ist auf klebrige Sitzungen angewiesen. Wenn Sie jemals einen Anwendungsserver herunterfahren möchten, nehmen Sie ihn aus dem Lastenausgleich, aber halten Sie ihn online, um die bereits zugewiesenen Sitzungen für eine Weile zu bedienen (sie werden schließlich auslaufen). Wird die Sitzungsreplikation nicht verwendet, verringert sich die erforderliche Verarbeitungskapazität in der Regel erheblich. Ja, es gibt einige Anwendungen, die definitiv eine Sitzungsreplikation benötigen, aber ich würde schätzen, dass sie 10% derjenigen sind, die diese Funktion ursprünglich nutzen möchten.

+0

Alles ist als verteilbar markiert, es sei denn, es gibt einen versteckten Ort, den ich nicht kenne, der ebenfalls als verteilbar gekennzeichnet werden muss.Wie auch immer, ich weiß, klebrige Sitzung ist der bevorzugte Weg, aber ich habe kein Mitspracherecht in dieser Angelegenheit – Kempe

+0

vielleicht gibt die fehlende Menge an Antworten auf diese Frage mehr Gewicht auf das Argument zu versuchen, diese Technik so lange wie möglich zu vermeiden (hoffentlich für immer). Auf diese Weise könnten Sie in dieser Angelegenheit etwas sagen ... –

+0

Ja, aber immer noch. Wenn Sie eine sticky-Sitzung verwenden und ein Knoten ausfällt, möchten Sie, dass der Benutzer fortfährt, als ob nie etwas auf dem anderen Knoten passiert wäre, oder? – Kempe