Я успешно использую репликацию сеансов в JBoss EAP 6.1 в Windows. Но затем я перешел на JBoss EAP 6.4 для тестирования разработчиков в Ubuntu, и тот же код перестал работать.
В этом нет ничего особенного, я просто добавил тег <distributable/>
и не добавлял никакого ручного значения serialVersionUID
в сериализованный класс Logged.java
(он остается аннотированным, чтобы игнорировать предупреждения).
Я сохраняю экземпляр класса в сеансе http, выключаю сервер с помощью jboss-cli.sh --connect command=:shutdown
(переменная окружения NOPAUSE=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, и тогда репликация сеанса «волшебным образом» начнет работать. Конечно, вам нужно объявить экземпляр класса как сериализуемый, чтобы его можно было сериализовать, но кроме этого я не вижу причин, по которым он не работает в JBoss EAP 6.4 в Ubuntu.
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)