Распространение транзакций не поддерживается для удаленных интерфейсов EJB

Liberty не поддерживает распространение исходящих или входящих транзакций для удаленных интерфейсов EJB. По умолчанию сущностные объекты EJB управляются контейнером и используют атрибут транзакции Required. Это значит, что имеющиеся определения EJB, в которых не заданы никакие свойства container-transaction, по умолчанию настраиваются для использования транзакций, хотя они не поддерживаются.

Это правило помечает код Java, использующий следующие аннотации EJB для применения удаленных бизнес-интерфейсов или домашних интерфейсов:

Это правило также отмечает следующие ссылки в файле ejb-jar.xml:

Для спецификации EJB требуются продукты с поддержкой распространения исходящих транзакций для продолжения отправки контекста пустых транзакций. Этот контекст может быть отклонен компонентами EJB, использующими атрибуты транзакции Required (значение по умолчанию), Mandatory или Supports. Клиент с активной глобальной транзакцией на может запустить сущностный объект EJB с атрибутами транзакции по умолчанию, если какой-либо клиент или сервер запущен в Liberty.

Чтобы клиент мог запустить сущностный объект EJB, этот объект EJB необходимо изменить для использования атрибутов транзакции RequiresNew или NotSupported. Хотя объект EJB с такими атрибутами может быть запущен, выполняемая им работа в транзакциях не будет фиксироваться в составе транзакций клиента.

Обратите внимание, что распространение транзакций поддерживается для удаленных интерфейсов EJB, выполняющихся в той же JVM, однако для этого требуется дополнительно исследовать алгоритм работы приложения.

Убедитесь в том, что удаленные интерфейсы EJB действительно нужны

Для объектов EJB 2.x удаленные интерфейсы часто не нужны, но настраиваются в ejb-jar.xml. Удаленные интерфейсы нужны только в том случае, если ваш код выполняется в двух разных JVM. В случае WebSphere это значит, что код должен выполняться на двух разных серверах приложений или в приложении-клиенте и на сервере приложений, которые используют разные JVM. Признаком использования удаленных объектов EJB может служить информация CORBA, например URL провайдера iiop://, в поиске EJB.

Обращение к объекту EJB, выполняющемуся в той же JVM, через удаленный интерфейс можно заменить на более эффективный локальный интерфейс. Всегда, когда это возможно, изменяйте аннотацию @Remote на @Local или @RemoteHome на @LocalHome и тестируйте все сценарии использования кода. По аналогии с конфигурацией ejb-jar.xml удалите определения <remote/> и <business-remote/> и протестируйте все сценарии использования. Хотя распространение транзакций поддерживается в этом случае, для большей эффективности рекомендуется перейти к использованию локальных интерфейсов.

Если удаленные интерфейсы действительно нужны

Используйте веб-службу в качестве оболочки для объектов EJB (JAX-WS)

Те объекты EJB, которые должны поддерживать удаленный доступ, лучше всего заключить в оболочку в виде веб-службы. См. инструкции по внесению соответствующих изменений в код с помощью WebSphere Application Server Developer Tools for Eclipse в документе Добавление аннотаций к объекту EJB для создания веб-службы. После добавления оболочки в виде веб-службы к объектам EJB используйте клиент веб-служб для вызова веб-службы EJB. После тестирования удалите аннотации Remote и соответствующую конфигурацию EJB.

Использование распространения транзакций
Liberty поддерживает протокол Web Services Atomic Transaction (WS-AT) для выполнения распределенных глобальных транзакций. Когда EJB развернут как веб-служба, для управления транзакциями можно использовать WS-AT. За дополнительной информацией обратитесь к документу Обзор Web Services Atomic Transaction.

За дополнительной информацией обратитесь к следующим разделам: