我使用的是mod_cluster版本1.2.11.Final和JBoss AS 7.2.0.Final(独立-完整模式)
mod_cluster已设置为启用粘性会话,我们通常同时运行2或3个JBoss服务器,并每天晚上旋转服务器以部署更新
当我们想关闭JBoss服务器时,我们使用CLI命令禁用该节点的所有上下文。
/subsystem=modcluster/:disable-context(virtualhost=my-webapp,context=/)
这将停止将新会话路由到ok节点
然后我们等待30分钟,但有时在这段时间之后,仍有一些会话处于活动状态
我试图强迫他们注销,并从这些用户的响应中删除JSESSIONID cookie,但是它们仍然被路由回相同的JBoss节点(向它们发出新的JSESSIONID)
是否可以命令mod_cluster删除这些粘性会话?....或将其强制给其他工作人员?
(我知道我可以取消部署该应用程序,但是有时候当剩余大量活动会话时,这会导致另一台服务器因需求的突然激增而崩溃)
期待听到您的建议
答案 0 :(得分:0)
对于其他有此问题的人,我通过在路径/ logout中注册@WebFilter创建了一种解决方法,在此过滤器中,我使会话无效并删除了JSESSIONID cookie,然后使用查询参数传递了重定向URI。用户将移至备用JBoss节点并重定向到其原始页面。您只需在检测到节点关闭时将它们重定向到/ logout。
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
session.invalidate();
String redirectUri = "/index.xhtml";
if(request.getParameterMap().containsKey("redirect")) {
String[] vals = request.getParameterMap().get("redirect");
if(vals.length>0) {
redirectUri = vals[0];
}
}
Cookie[] userCookies = request.getCookies();
if (userCookies != null && userCookies.length > 0 ) {
for (int i = 0; i < userCookies.length; i++) {
if(userCookies[i].getName().equals("JSESSIONID")) {
Cookie jSessionId = userCookies[i];
jSessionId.setMaxAge(0);
response.addCookie(jSessionId);
}
}
}
response.sendRedirect(redirectUri);
}