MOD_CLUSTER - 删除粘性会话

MOD_CLUSTER - remove sticky session

我正在使用 mod_cluster 版本 1.2.11.Final 以及 JBoss AS 7.2.0.Final(独立-ha-完整模式)

mod_cluster 设置为启用了粘性会话,我们通常同时拥有 2 或 3 个 JBoss 服务器 运行,并且每天晚上轮换服务器以部署更新

当我们想要关闭 JBoss 服务器时,我们使用 CLI 命令禁用该节点的所有上下文..

/subsystem=modcluster/:disable-context(virtualhost=my-webapp,context=/)

这会停止将任何新会话路由到节点 ok

然后我们等待 30 分钟,但有时过了这个时间仍有一些会话处于活动状态

我已经尝试强制他们注销并从这些用户的响应中删除 JSESSIONID cookie,但他们仍然被路由回同一个 JBoss 节点(他们被发布了一个新的 JSESSIONID)

是否可以命令 mod_cluster 删除这些粘性会话?....或强制将它们交给另一个工作人员?

(我知道我可以取消部署应用程序,但有时当有很多活动会话剩余时,这会导致另一台服务器因需求突然激增而崩溃)

期待听到您的建议

对于遇到此问题的任何其他人,我通过为路径 /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);

    }