2014-02-13 4 views
5

Я пытаюсь включить репликацию сеанса в liferay на tomcat без большой удачи. Я написал небольшой тест, чтобы увидеть, реплицируются ли сеансы, и он хорошо работает в отдельном JSP-файле, который я разместил под webapps/examples, но когда я вводил тот же код в 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? Я добавил к портлета распределению среди/WEB-INF/web.xml

Edit 1: Версии

liferay 6.1.1 
Tomcat 7.0.47 

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

на этот раз я устанавливаю только переменную, если ее значение равно нулю. И он работает так, как ожидалось, в 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. Причина в том, что каждый из них является отдельным webapp.

Однако использование репликации сеанса создает огромное количество накладных расходов. Если вы создаете кластер по соображениям производительности, вы сразу же едите совсем немного.

Стандартный совет (я знаю, вы не просите об этом, но я хотел бы увидеть его здесь, чтобы другие узнали вопрос позже) заключается в том, чтобы полагаться на липкие сессии. Если вы когда-либо захотите закрыть один сервер приложений, выньте его из балансировщика нагрузки, но держите его в сети, чтобы обслуживать уже выделенные сеансы какое-то время (они в конечном итоге закончится). Не используя репликацию сеанса, как правило, значительно снижается требуемая производительность обработки. Да, есть некоторые приложения, которые определенно нуждаются в репликации сеанса, но я бы оценил их как 10% тех, кто изначально хочет использовать эту функцию.

+0

Все помечено как распространяемое, если есть какое-то скрытое место, о котором я не знаю, также должен быть помечен как распространяемый.Во всяком случае, я знаю, что липкая сессия - это предпочтительный способ, но я не имею в этом никакого мнения – Kempe

+0

Возможно, недостающее количество ответов на этот вопрос дает больше веса аргументу о попытке избежать этой техники как можно дольше (надеюсь, навсегда). Таким образом, вы можете получить некоторые слова в этом вопросе ... –

+0

Да, но все же. Если вы используете липкую сессию и один узел, вы хотите, чтобы пользователь продолжал, как будто ничего не произошло на другом узле, не так ли? – Kempe

Смежные вопросы