使用jetty-maven-plugin进行Jetty会话聚类

时间:2015-09-21 16:32:39

标签: java webserver jetty embedded-jetty maven-jetty-plugin

我正在尝试使用this

设置会话群集

我的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>
.....

我的jetty-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,因为Server实例未设置为我的WebAppContext实例,所以我无法使用以下命令获取sessionIdManager:

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

我查看了jetty-maven插件源,发现它首先配置我的WebAppContext实例,然后调用setServer:

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

如何正确设置会话群集内容?

1 个答案:

答案 0 :(得分: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();
    }
}

似乎现在正在工作。