Dropwizard会话聚类

时间:2014-09-26 07:58:59

标签: java jetty dropwizard session-management

我需要一种方法来跨不同的dropwizard Web服务共享会话。在Jetty中,有一种方法可以使用JDBCSessionIdManager和JDBCSessionManager(http://wiki.eclipse.org/Jetty/Tutorial/Session_Clustering)来完成。

问题是dropwizard(0.7.1)没有公开所需的org.eclipse.jetty.server.Server的引用,因此没有明显的方法来更改SessionManager和SessionIdManager。 我已经看到服务器是在io.dropwizard.cli.ServerCommand#中创建的,通过io.dropwizard.server.ServerFactory运行,但io.dropwizard.cli.ServerCommand#run中的引用是本地的,所以我甚至无法使用反射得到我想要的参考。

我应该在dropwizard中做什么来更改SessionManager和SessionIdManager?

谢谢,
亚历

2 个答案:

答案 0 :(得分:1)

我能够通过挂钩生命周期来实现它。

private void addSessionHandler(final Environment env, final DataSource dataSource) {
    env.lifecycle().addLifeCycleListener(new AbstractLifeCycleListener() {
        @Override
        public void lifeCycleStarting(LifeCycle event) {
            if (!(event instanceof Server)) {
                return;
            }

            Server server = (Server) event;
            JDBCSessionIdManager ids = jdbcSessionIdManager(server);
            server.setSessionIdManager(ids);
            env.servlets().setSessionHandler(new SessionHandler(jdbcSessionManager(ids)));
        }

        private JDBCSessionManager jdbcSessionManager(JDBCSessionIdManager idManager) {
            JDBCSessionManager m = new JDBCSessionManager();
            m.setSessionIdManager(idManager);
            return m;
        }

        private JDBCSessionIdManager jdbcSessionIdManager(Server server) {
            JDBCSessionIdManager m = new JDBCSessionIdManager(server);
            m.setWorkerName("");
            m.setDatasource(dataSource);
            return m;
        }
    });
}

答案 1 :(得分:0)

我使用了Hazelcast(http://hazelcast.org)代替。 这是否过度取决于取决于您想要实现的目标,以及您是否能负担得起代码中的另一个依赖项。但就灵活性和易于实施而言,我绝对推荐它。

我将它用作分布式地图,而不是将数据存储在会话本身中。

您可以在此处查看一些示例:http://hazelcast.org/use-cases/clustering/http://hazelcast.org/use-cases/caching/