2014-10-30 42 views
1

我们得到此异常:JSF - SessionExpirationPhaseListener上一个JBoss集群

TimeoutException异常:JBAS010213:无法获得锁默认主机/ ...

我们使用这些的PhaseListener在我们的网页应用程序捕获会话超时的Ajax请求,并重定向到索引(我们怀疑这可能是相关的,但我们不知道):

public class SessionExpirationPhaseListener implements PhaseListener { 

@Override 
public PhaseId getPhaseId() { 

    return PhaseId.RESTORE_VIEW; 

} 

@Override 
public void beforePhase(PhaseEvent event) { 
} 

@Override 
public void afterPhase(PhaseEvent event) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    HttpServletRequest httpRequest = (HttpServletRequest) context.getExternalContext().getRequest(); 
    if (httpRequest.getRequestedSessionId() != null && !httpRequest.isRequestedSessionIdValid()) { 
     String facesRequestHeader = httpRequest.getHeader("Faces-Request"); 
     boolean isAjaxRequest = facesRequestHeader != null && facesRequestHeader.equals("partial/ajax"); 
     // navigate to home page only for ajax requests 
     if (isAjaxRequest) { 
      ConfigurableNavigationHandler handler = (ConfigurableNavigationHandler) context.getApplication().getNavigationHandler(); 
      handler.performNavigation("home"); 
     } 
    } 
} 

}

我们正在运行一个带有2个节点(mod_cluster + apache)的JBoss群集并启用了SSO。 你们知道什么可能是错的吗?或者至少将我们指向正确的方向?

谢谢, 关心。

+0

您正在使用什么版本的JBoss?你是否启用了粘滞会话模式? – 2014-10-30 22:42:04

+0

Federico,我们正在使用JBoss EAP 6.3并启用粘滞会话模式。 – Mateo 2014-10-31 12:22:42

回答

1

我相信这里的问题是两个节点试图访问同一个会话,其中一个节点正在处理传入请求,而第二个节点正在执行会话过期。

检查Cookie正在您的ajax调用中发送,可能的问题是在不是会话拥有者的节点中执行阶段侦听器。

编辑:

可能存在关联到这个问题,这个bug:https://bugzilla.redhat.com/show_bug.cgi?id=993041

+0

我们删除了SessionExpirationPhaseListener,但仍在发生。 – Mateo 2014-11-04 13:05:46

+1

@Mateo请看看我添加回答的链接。 – 2014-11-04 13:22:11

+0

第一个链接似乎与我们的场景非常相似,但我不明白第二个链接。 – Mateo 2014-11-04 14:40:38