java - 为什么 JBoss EAP 6.4 无法使用 http session 复制机制加载 session ?

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

我已经在 Windows 的 JBoss EAP 6.1 中成功使用 session 复制。但后来我改用 JBoss EAP 6.4 在 ubuntu 中进行开发测试,相同的代码停止工作。

没有太多内容,我只是添加了 <distributable/>标签并且没有添加任何手册serialVersionUID序列化类的值 Logged.java (它保留注释以忽略警告)。

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

...

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 中,然后 session 复制将“神奇地”开始工作。当然,您需要将类实例声明为可序列化才能被序列化,但除此之外,我看不出它为什么不能在 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)

最佳答案

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

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

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

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

关于java - 为什么 JBoss EAP 6.4 无法使用 http session 复制机制加载 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29857580/

相关文章:

java - Android - 从最近的应用程序刷应用程序时服务停止

java - JAX-WS + hibernate + JAXB : How to avoid LazyInitializationException during marshalling

java - Web.xml 错误页面未捕获未经检查的异常

css - 如何让 NGINX 提供 .js、.css、.html 等静态内容?

java - 带 dotcms 的 jboss 最低配置

java - 为什么我们使用 web.xml?

java - 显示 "Context initialization failed"之后的设置

java - Java源代码中最长的类有多长?

java - 我的表输出的百分比值不正确

java - Hibernate + 支持 SQLite Pragmas 在 Windows 7 机器上提高速度