为什么JBoss EAP 6.4 无法加载使用http 会话复制机制的会话?
Why JBoss EAP 6.4 fail to load the session using the http session replication mechanism?
我在 Windows 的 JBoss EAP 6.1 中成功地使用了会话复制。但后来我在 ubuntu 中更改为 JBoss EAP 6.4 进行开发测试,但相同的代码停止工作。
没什么,我只是添加了 <distributable/>
标签,并没有向序列化的 class Logged.java
添加任何手动 serialVersionUID
值(它保持注释为忽略警告)。
我将 class 的实例存储在 http 会话中,使用 jboss-cli.sh --connect command=:shutdown
(NOPAUSE=true
环境变量)关闭服务器,然后再次启动服务器。服务器启动后,当我再次尝试访问会话时,我无法检索到 class 实例,控制台中出现以下错误:
...
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.invo
ke(DistributedCacheManager.java:229)
at org.jboss.as.clustering.web.infinispan.DistributedCacheManager.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 中,然后会话复制将 "magically" 开始工作。当然,您需要将 class 实例声明为可序列化才能被序列化,但除此之外,我看不出为什么它在 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)
沿着堆栈跟踪向下。应该有一个原因(嵌套异常),我怀疑它是不可序列化的或空指针。否则,您可能会更早地找到另一个异常,即不可序列化
会话 persistence/replication 问题的最可能原因是试图在会话中存储不可序列化的对象。这会导致会话的存储失败,后续的检索也无法进行。
请记住,不仅要存储的 class 必须是可序列化的,而且任何非静态非瞬态字段都必须递归序列化。这可能很难找到而且很乏味。
关于 serialVersionUID 这只会导致问题,如果您在集群内的不同服务器上部署了来自不同编译的版本,因为编译器会自动创建一个,因此如果它们来自相同的编译,它们将匹配。
我在 Windows 的 JBoss EAP 6.1 中成功地使用了会话复制。但后来我在 ubuntu 中更改为 JBoss EAP 6.4 进行开发测试,但相同的代码停止工作。
没什么,我只是添加了 <distributable/>
标签,并没有向序列化的 class Logged.java
添加任何手动 serialVersionUID
值(它保持注释为忽略警告)。
我将 class 的实例存储在 http 会话中,使用 jboss-cli.sh --connect command=:shutdown
(NOPAUSE=true
环境变量)关闭服务器,然后再次启动服务器。服务器启动后,当我再次尝试访问会话时,我无法检索到 class 实例,控制台中出现以下错误:
...
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.invo
ke(DistributedCacheManager.java:229)
at org.jboss.as.clustering.web.infinispan.DistributedCacheManager.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 中,然后会话复制将 "magically" 开始工作。当然,您需要将 class 实例声明为可序列化才能被序列化,但除此之外,我看不出为什么它在 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)
沿着堆栈跟踪向下。应该有一个原因(嵌套异常),我怀疑它是不可序列化的或空指针。否则,您可能会更早地找到另一个异常,即不可序列化
会话 persistence/replication 问题的最可能原因是试图在会话中存储不可序列化的对象。这会导致会话的存储失败,后续的检索也无法进行。
请记住,不仅要存储的 class 必须是可序列化的,而且任何非静态非瞬态字段都必须递归序列化。这可能很难找到而且很乏味。
关于 serialVersionUID 这只会导致问题,如果您在集群内的不同服务器上部署了来自不同编译的版本,因为编译器会自动创建一个,因此如果它们来自相同的编译,它们将匹配。