2014-09-26 164 views
0

我需要一種方法來通過不同的dropwizard web服務共享會話。在Jetty中,有一種方法可以通過使用JDBCSessionIdManager和JDBCSessionManager(http://wiki.eclipse.org/Jetty/Tutorial/Session_Clustering)來完成。Dropwizard會話羣集

問題是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?

感謝,
亞歷

回答

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; 
     } 
    }); 
}