【问题标题】:Jetty session clustering using jetty-maven-plugin使用 jetty-maven-plugin 进行 Jetty 会话集群
【发布时间】:2015-09-21 16:32:39
【问题描述】:

我正在尝试使用this 设置会话集群

我的码头.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,因为服务器实例未设置为我的 WebAppContext 实例,所以我无法使用 sessionIdManager 获取我的 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);

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

【问题讨论】:

  • 您在滥用jetty-maven-plugin 的角色(用于测试简单的网络应用程序)。您最好通过添加为您的实例配置的start.ini 将您的项目设为正式的${jetty.base}
  • @JoakimErdfelt 我们已经有很多应用程序配置为使用 jetty-maven 插件。重新配置所有东西会有点贵。我发布了我在下面找到的解决方案。可以接受吗?

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


【解决方案1】:

在挖掘源代码后,我扩展了 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();
    }
}

现在似乎可以工作了。

【讨论】:

  • 这是一个避免正确使用 Jetty 的技巧。 jetty-maven-plugin 不是用来运行生产服务器的。 很危险。您同时拥有所有 Jetty、所有 Maven、其所有插件、所有项目依赖项都在服务器类路径上,然后又在 WebAppClassLoader 中。通常有相互冲突的行为,谁知道有多少漏洞。强烈建议您正确使用 Jetty 进行生产。
  • @JoakimErdfelt 感谢您的建议!我们会考虑的。
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 2016-12-20
  • 1970-01-01
  • 2016-02-29
  • 2012-11-17
  • 1970-01-01
  • 2011-12-26
  • 2012-11-27
相关资源
最近更新 更多