我需要一种方法来跨不同的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?
谢谢,
亚历
答案 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/