Почему JBoss EAP 6.4 не может загрузить сеанс, используя механизм репликации сеанса http?

Я успешно использую репликацию сеансов в 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)

person Fagner Brack    schedule 24.04.2015    source источник


Ответы (1)


Следуйте по трассировке стека вниз. Должна быть причина (вложенное исключение), и я подозреваю, что это несериализуемый или нулевой указатель. В противном случае вы можете найти другое исключение ранее, которое не является сериализуемым.

Наиболее вероятной причиной проблем сохранения/репликации сеанса является попытка сохранить несериализуемый объект в сеансе. Это приводит к сбою сохранения сеанса и невозможности последующего извлечения.

Помните, что не только сохраняемый класс должен быть сериализуемым, но и любые нестатические непереходные поля рекурсивно. Это может быть очень трудно и утомительно найти.

Что касается serialVersionUID, это вызовет проблемы только в том случае, если у вас есть версии из разных компиляций, развернутых на разных серверах в кластере, поскольку компилятор создаст их автоматически, поэтому, если они из одной компиляции, они будут совпадать.

person redge    schedule 25.04.2015
comment
Хорошо, но тогда тот же код не сработает для JBoss EAP 6.1, верно? Дело в том... что нет! Я опубликую всю трассировку стека в виде списка (он довольно большой), а затем обновлю ответ. - person Fagner Brack; 25.04.2015
comment
Вы добавили ‹distributable/›, это могло изменить поведение. Было ли ваше развертывание 6.1 правильно кластеризовано и реплицировано? - person redge; 25.04.2015
comment
Я не добавил <distributable/>. Это уже было в кодовой базе, работающей с JBoss EAP 6.1. - person Fagner Brack; 25.04.2015
comment
Можете ли вы включить полную трассировку стека, включая любые вложенные исключения? - person redge; 25.04.2015
comment
Прошу прощения, больше не смог воспроизвести. Я считаю, что мой анализ был предвзятым из-за отсутствующего файла свойств, который вызвал ошибку во время выполнения. Я предположил, что это проблема сервера, не проверив должным образом полный журнал (ленивый, ленивый мальчик). Теперь я не могу вернуться к тому моменту, когда это было воспроизводимо. Правильным ответом в данном случае будет объяснение, почему это обычно происходит. Например: JBoss не может прочитать сеанс, если в полной трассировке стека отображается другая ошибка времени выполнения, в большинстве случаев это не проблема сервера, а проблема приложения, например, отсутствующий файл свойств. Спасибо - person Fagner Brack; 25.04.2015
comment
(Я не мог добавить трассировку стека ранее, потому что у меня были некоторые внешние проблемы) - person Fagner Brack; 25.04.2015