2014-02-13 59 views
5

我想能夠在Tomcat上Liferay的會話複製沒有多少運氣。我已經寫了一個小測試,看看會話被複制和它運作良好,在我所劃歸的webapps /例子一個獨立的JSP文件,但是當我輸入一個Liferay的-porlet相同的代碼只有JSESSION是正確的。Liferay的集羣會話複製

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); 

有人知道爲什麼它不在liferay-portlet中工作嗎?我已經加入分配對portlet/WEB-INF/web.xml中

編輯1:版本

liferay 6.1.1 
Tomcat 7.0.47 

編輯2:我嘗試另一個測試。

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); 

這次我只設置變量,如果它爲空。它在liferay之外的JSP中按預期工作,但在liferay中它就是這樣。

  1. 第一臺服務器獲取請求中得到空端設置變量
  2. 當其他服務器獲取也變得無效請求和格紋圖案變量
  3. 當那得到了第一個請求的服務器試圖得到它從第二個服務器獲取值的變量。所以現在它被複制。

不要緊哪個服務器獲得的第一個請求,它總是同樣的結局呢

編輯4.集羣信息

節點:2 負載均衡:

<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

請提供例如集羣設置的相關細節portal-ext.properties文件,集羣拓撲結構等。 –

回答

1

如果你想正確的會話複製,你應該聲明門戶網站以及所有的插件爲distributable。原因是每個人都是一個單獨的web應用程序。

然而,利用會話複製產生鉅額的開銷。如果您出於性能方面的原因建立集羣,那麼您馬上就會吃掉相當多的額外性能。

標準的建議(我知道,你不是要求這個,但我希望在這裏看到它爲其他人找到問題後)是依靠粘滯的會議。如果您想關閉一臺應用程序服務器,請將其從負載平衡器中取出,但保持聯機狀態以便爲已分配的會話服務一段時間(最終它們將耗盡)。不使用會話複製通常會顯着降低所需的處理能力。是的,有一些應用程序肯定需要會話複製,但我估計它們是最初希望使用此功能的應用程序的10%。

+0

一切都被標記爲可分發,除非有一些我不知道的隱藏的地方也需要標記爲可分發。無論如何,我知道粘滯的會議是首選的方式,但我沒有在這個問題上的發言 – Kempe

+0

也許這個問題的答案缺少的數量給予更多的權重試圖儘量避免這種技術的論點(希望永遠)。這樣,你可能會在這件事情上得到一些發言... –

+0

是的,但仍然。如果您使用粘性會話並且一個節點發生故障,您希望用戶繼續,就好像其他節點上沒有發生過任何事情一樣,是嗎? – Kempe