【问题标题】:Why JBoss EAP 6.4 fail to load the session using the http session replication mechanism?为什么 JBoss EAP 6.4 使用 http 会话复制机制加载会话失败?
【发布时间】:2015-04-24 21:12:37
【问题描述】:

我在 Windows 的 JBoss EAP 6.1 中成功地使用了会话复制。但后来我改用 JBoss EAP 6.4 在 ubuntu 中进行开发测试,同样的代码停止工作。

没什么,我只是添加了<distributable/>标签,并没有向序列化类Logged.java添加任何手动serialVersionUID值(它保持注释以忽略警告)。

我将类的实例存储在 http 会话中,使用jboss-cli.sh --connect command=:shutdownNOPAUSE=true 环境变量)关闭服务器,然后再次启动服务器。服务器启动后,当我再次尝试访问会话时,我无法检索到类实例,并且控制台中出现以下错误:

...

21:47:13,852 WARN  [org.jboss.as.clustering.web.infinispan] (http-/0.0.0.0:80-1)
 JBAS010322: Failed to load session 9OQtRW3Vgc-uf8w3DmRHD+PK: java.lang.RuntimeE
xception: JBAS010333: Failed to load session attributes for session: 9OQtRW3Vgc-
uf8w3DmRHD+PK
        at org.jboss.as.clustering.web.infinispan.DistributedCacheManager$2.invo
ke(DistributedCacheManager.java:229)
        at org.jboss.as.clustering.web.infinispan.DistributedCacheManager$2.invoke(DistributedCacheManager.java:212)
        at org.jboss.as.clustering.infinispan.invoker.SimpleCacheInvoker.invoke(SimpleCacheInvoker.java:34)
        at org.jboss.as.clustering.infinispan.invoker.BatchCacheInvoker.invoke(BatchCacheInvoker.java:48)
        at org.jboss.as.clustering.infinispan.invoker.RetryingCacheInvoker.invoke(RetryingCacheInvoker.java:85)
        at org.jboss.as.clustering.web.infinispan.DistributedCacheManager$ForceSynchronousCacheInvoker.invoke(DistributedCacheManager.java:550)
        at org.jboss.as.clustering.web.infinispan.DistributedCacheManager.getData(DistributedCacheManager.java:238)
        at org.jboss.as.clustering.web.infinispan.DistributedCacheManager.getSessionData(DistributedCacheManager.java:196)
        at org.jboss.as.web.session.DistributableSessionManager.loadSession(DistributableSessionManager.java:1429) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
        at org.jboss.as.web.session.DistributableSessionManager.findSession(DistributableSessionManager.java:688) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
 at org.jboss.as.web.session.DistributableSessionManager.findSession(DistributableSessionManager.java:84) [jboss-as-web-7.5.0.Final-redhat-21.jar:7.5.0.Final-redhat-21]
        at org.apache.catalina.connector.Request.doGetSession(Request.java:2661) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
        at org.apache.catalina.connector.Request.getSession(Request.java:2382) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
        at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:791) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
        at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:801) [jbossweb-7.5.7.Final-redhat-1.jar:7.5.7.Final-redhat-1]
        at org.webstories.core.auth.AuthSession.from(AuthSession.java:12) [classes:]
...

我不知道从哪里开始研究,因为我不了解 JBoss 的内部结构,除了在网络上广泛记录的内容。在这种情况下,记录的是您只需将<distributable/> 添加到 web.xml 中,然后会话复制将“神奇地”开始工作。当然,您需要将一个类实例声明为可序列化才能被序列化,但除此之外,我看不出它为什么不能在 Ubuntu 的 JBoss EAP 6.4 中运行。

lsb_release -a:

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.2 LTS
Release:        14.04
Codename:       trusty

java -version:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) Client VM (build 25.45-b02, mixed mode)

【问题讨论】:

    标签: java jboss web.xml jboss-eap-6 session-replication


    【解决方案1】:

    沿着堆栈跟踪向下。应该有原因(嵌套异常),我怀疑它是不可序列化的或空指针。否则,您可能会更早地找到另一个不可序列化的异常

    会话持久性/复制问题的最可能原因是尝试在会话中存储不可序列化的对象。这会导致会话存储失败,后续检索无法继续。

    请记住,不仅要存储的类必须是可序列化的,而且任何非静态非瞬态字段都必须是递归的。这可能很难找到而且很乏味。

    关于serialVersionUID,只有当您在集群内的不同服务器中部署了来自不同编译的版本时,这才会导致问题,因为编译器会自动创建一个,因此如果它们来自相同的编译,它们将匹配。

    【讨论】:

    • 好吧,但是对于 JBoss EAP 6.1,同样的代码会失败,对吧?问题是……没有!我会将整个堆栈跟踪发布在一个要点中(它非常大),然后我更新答案。
    • 你添加了 这可能改变了行为。您的 6.1 部署是否已正确集群和复制?
    • 我没有添加<distributable/>。它已经在与 JBoss EAP 6.1 一起使用的代码库中。
    • 您能否包含完整的堆栈跟踪,包括任何嵌套异常?
    • 对不起,我无法再复制了。我相信我的分析是有偏差的,因为缺少导致运行时错误的属性文件。我认为是服务器问题而没有正确检查完整日志(懒惰,懒惰的男孩)。现在我无法回到可重现的地步。在这种情况下,正确的答案是解释为什么通常会发生这种情况。例如:如果完整堆栈跟踪中显示另一个运行时错误,则 JBoss 无法读取会话,大多数情况下这不是服务器问题,而是应用程序问题,例如缺少属性文件。谢谢
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2016-01-11
    • 2018-05-07
    相关资源
    最近更新 更多