2015-09-21 5 views
2

Я пытаюсь настроить сеанс кластеризацию с помощью thisJetty сессия кластеризация с использованием пристаней-Maven-плагин

Мой jetty.xml:

.... 
<Set name="sessionIdManager"> 
    <New id="jdbcIdMgr" class="org.eclipse.jetty.server.session.JDBCSessionIdManager"> 
     <Arg> 
      <Ref id="Server"/> 
     </Arg> 
     <Set name="workerName"><Property name="jetty.jdbcSession.workerName" default="node1"/></Set> 
     <Set name="scavengeInterval"><Property name="jetty.jdbcSession.scavenge" default="1800"/></Set> 

     <Call name="setDriverInfo"> 
      <Arg><Property name="jetty.jdbcSession.driverClass" 
          default="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"/></Arg> 
      <Arg><Property name="jetty.jdbcSession.connectionURL" 
          default="jdbc:mysql://${datasource.dbServerName}:${datasource.dbServerPort}/${datasource.dbName}"/></Arg> 
     </Call> 
    </New> 
</Set> 
..... 

Мой Пристань-web.xml:

<Get name="Server"> 
     <Get id="jdbcIdMgr" name="sessionIdManager"/> 
    </Get> 

    <Set name="sessionHandler"> 
     <New class="org.eclipse.jetty.server.session.SessionHandler"> 
      <Arg> 
       <New id="jdbcmgr" class="org.eclipse.jetty.server.session.JDBCSessionManager"> 
        <Set name="idManager"> 
         <Ref id="jdbcIdMgr"/> 
        </Set> 
       </New> 
      </Arg> 
     </New> 
    </Set> 

Проблема в том, что я получаю NPE во время запуска сервера, потому что экземпляр сервера не установлен в мой экземпляр WebAppContext, поэтому я не могу получить свой sessionIdManager, используя:

<Get name="Server"> 
    <Get id="jdbcIdMgr" name="sessionIdManager"/> 
</Get> 

Я смотрел на Пристань-Maven плагин источников и обнаружил, что сначала он настраивает свой экземпляр WebAppContext, а затем в вызовах setServer:

//set up the webapp and any context provided 
    this.server.configureHandlers(); 
    configureWebApplication(); 
    this.server.addWebApplication(webApp); 

Как я могу правильно настроить свой сеанс кластерного материал?

+0

Вы очень злоупотребляете роль 'jetty-maven-plugin' (для тестирования простых webapps). Возможно, вам лучше сделать ваш проект официальным '$ {jetty.base}', добавив 'start.ini', настроенный для вашего экземпляра. –

+0

@JoakimErdfelt У нас уже есть множество приложений, настроенных для использования плагина jetty-maven. Будет немного дорого переконфигурировать все. Я опубликовал решение, которое я нашел ниже. Это приемлемо? – pomkine

ответ

0

Порывшись в источниках я протянул JDBCSessionManager класс, где я поставил _sessionIdManager свойство:

import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.server.session.HashSessionIdManager; 
import org.eclipse.jetty.server.session.JDBCSessionManager; 

public class ScoopSessionManager extends JDBCSessionManager { 

    @Override 
    public void doStart() throws Exception { 
     final Server server = getSessionHandler().getServer(); 
     _sessionIdManager = server.getSessionIdManager(); 
     if (_sessionIdManager == null) { 
      _sessionIdManager = new HashSessionIdManager(); 
      server.setSessionIdManager(_sessionIdManager); 
     } 
     super.doStart(); 
    } 
} 

, кажется, работает.

+0

Это взломать, чтобы избежать использования Jetty правильно. 'jetty-maven-plugin' не предназначен для запуска производственного сервера. **Это опасно**. У вас есть все Jetty, все Maven, все его плагины, все зависимости вашего проекта от пути к классу сервера одновременно, а затем снова в WebAppClassLoader. Часто с конфликтующим поведением и кто знает, сколько уязвимостей. Настоятельно рекомендуем вам правильно использовать Jetty для производства. –

+0

@JoakimErdfelt Спасибо за совет! Мы подумаем. – pomkine

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