EJB 3.x onMessage () против транзакционного контекста @Timeout

#java #transactions #jakarta-ee #ejb-3.0 #ejb

#java #транзакции #джакарта-ee #ejb-3.0 #ejb

Вопрос:

в EJB 3.x как для onMessage() метода MDB, так и для @Timeout метода SLSBS и MDBS распространение транзакций отсутствует. То есть нет клиента для выполнения метода, поэтому транзакция не может быть распространена.

При использовании транзакций, управляемых контейнером, я бы ожидал, что оба случая будут принимать одно и то же javax.ejb.TransactionAttributeType . Однако они этого не делают.

Для onMessage() метода допустимыми атрибутами транзакции являются REQUIRED и NOT_SUPPORTED, тогда как для @Timeout методов REQUIRE, REQUIRES_NEW и NOT_SUPPORTED.

В частности, для @Timeout методов, указанных в спецификации (пункт 18.2.8):

Обратите внимание, что контейнер должен запустить новую транзакцию, если используется ТРЕБУЕМЫЙ атрибут транзакции. Это значение атрибута транзакции разрешено, так что спецификация атрибута транзакции для метода обратного вызова по таймауту может быть выполнена по умолчанию.

Если я правильно понял, обычно здесь следует использовать REQUIRE_NEW , но поскольку REQUIRED является значением по умолчанию для EJB, это также разрешено для @Timeout методов, придавая ему ту же семантику, что и REQUIRE_NEW, поскольку нет возможности распространения транзакции.

Вопросы:

  1. Правильно ли я понимаю?
  2. Почему REQUIRES_NEW не является приемлемым также в onMessage() ? Отличается ли это как-то в отношении транзакций?

ОБНОВЛЕНИЕ: То же самое относится и к другим случаям, где поддерживается REQUIRES_NEW: @Asynchronous и @PostConstruct / @PreDestroy методы.

Ответ №1:

  1. Да, ваше понимание правильное.

  2. На мой взгляд, @Timeout является странным для указания REQUIRES_NEW. Спецификация в основном требует, чтобы контейнер обновлял базу данных постоянного таймера в рамках той же транзакции, что и метод timeout. На самом деле это ничем не отличается от транзакционной доставки сообщений JCA, за исключением того, что в сценарии JCA более очевидно, что транзакцию обрабатывает внешний компонент. Я полагаю, вы могли бы возразить, что нет компонента JavaEE, управляющего методом @Timeout, но, на мой взгляд, было бы лучше запретить REQUIRES_NEW для обоих. Несмотря на это, несоответствие является странным, поэтому, возможно, MDB будет обновлен в более поздней версии спецификации, чтобы разрешить REQUIRES_NEW .

Комментарии:

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