Выявление проблем с сериализацией в некластеризованной среде

У меня есть интегрированное приложение JSF-Spring. Приложение хорошо работает в моей некластерной среде. При развертывании приложения в среде clustered[wildfly 8.0.0] я сталкиваюсь с различными проблемами, связанными с сериализацией. В некоторых примерах классы DTO не были реализованы Serializable, пытаются сериализовать класс Logger, чего я не хочу, и т. д.

Приложение, развернутое в кластерной среде, имеет распространяемый тег ‹ /> в моем файле web.xml, поэтому оно пытается выполнить репликацию сеанса между узлами, но это не удается в несериализуемых случаях.

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

Итак, мой вопрос заключается в том, как лучше всего увидеть все эти проблемы с сериализацией на моем тестовом сервере [wildfly 8.0.0], который является некластерной средой.

Добавление сведений об одном исключении для большей ясности:

Caused by: java.lang.RuntimeException: Failure to marshal argument(s)
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.marshallCall(CommandAwareRpcDispatcher.java:333)
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.processSingleCall(CommandAwareRpcDispatcher.java:352)
at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:167)
... 76 more
Caused by: org.infinispan.commons.marshall.NotSerializableException: com.org.account.service.AccountExpServiceImpl
Caused by: an exception which occurred:
in field accountExpService
in field m
in object java.util.HashMap@85b67fbe
in object org.jboss.as.clustering.marshalling.SimpleMarshalledValue@85b67fbe
in object org.infinispan.commands.write.ReplaceCommand@ec0c12ad
in object org.infinispan.commands.tx.PrepareCommand@ce32eb5a

person Sam    schedule 29.01.2015    source источник
comment
Прочитайте журналы, найдите эти исключения и либо сделайте соответствующий класс Serializable, либо узнайте, почему он сериализуется, если вы этого не ожидаете.   -  person user207421    schedule 30.01.2015
comment
Спасибо за комментарий. Я решаю эти проблемы одну за другой, проблема, с которой я сталкиваюсь здесь, заключается в том, что эти исключения будут срабатывать только в кластере, когда он пытается реплицировать сеанс. Так как же можно увидеть все эти проблемы в некластерной среде?   -  person Sam    schedule 30.01.2015
comment
Попробуйте сериализовать все свои bean-компоненты самостоятельно или действительно попробуйте сериализовать Session.   -  person user207421    schedule 30.01.2015
comment
Ищу другие предложения   -  person Sam    schedule 30.01.2015
comment
Один из вариантов — использовать какой-нибудь статический анализатор кода, например SonarQube. Эти инструменты могут сообщать обо всех подобных случаях, и вы можете решать их по одному в своем поле разработки. Вам могут помочь такие правила, как findbugs:SE_BAD_FIELD или pmd:BeanMembersShouldSerialize.   -  person Sam    schedule 05.03.2015


Ответы (2)


Мы используем следующую утилиту, чтобы проверить, может ли Infinispan сериализовать данный объект или нет:

org.infinispan.manager.DefaultCacheManager.getCacheManagerConfiguration().serialization().marshaller().isMarshallable(objectToCheck);

На самом деле это часть наших тестов.

person Vladimir Dzhuvinov    schedule 26.07.2015

У вас могут быть разные профили для локального запуска приложения с использованием web.xml без <distributable/> и один для развертывания, готовый к кластеру и, следовательно, с тегом <distributable/>. Если вы создаете с помощью Maven, вам нужно обратить внимание на военный плагин и профили. См. этот ответ для предоставления зависящего от профиля web.xml

Однако это решение кардинально меняет поведение системы между средами dev и production. Обнаружение проблем с сериализацией только после развертывания может быть дорогостоящим (с точки зрения времени и усилий).

Поэтому сортировка проблем сериализации одна за другой — это правильный путь.

person diginoise    schedule 09.02.2016