0

我正在使用 mod_cluster 版本 1.2.11.Final 和 JBoss AS 7.2.0.Final (standalone-ha-full 模式)

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

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

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

这会阻止任何新会话被路由到节点 ok

然后我们等待 30 分钟,但有时在此之后仍有一些会话处于活动状态

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

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

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

期待听到您的建议

4

1 回答 1

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

    }
于 2019-08-13T08:41:22.387 回答