Message-driven bean (EJB3) в WebSphere 7, XA транзакции, обработка ошибок

Я относительный новичок в EJB. Предыстория: У меня есть MDB, использующий стандартный провайдер сообщений WebSphere, принимающий MapMessages, который имеет java.sql.DataSource для выполнения некоторой работы, используя preparedstatement, jdbc transaction и т.д. Я настроил MDB в ibm-ejb-bnd.xml и ejb-jar.xml, используя адаптер JCA с активацией-спецификацией и именем назначения. Я добавил java.sql.DataSource в ejb-jar и ibm-ejb-jar-bind. Я также добавил DataSource в MessageListener с аннотацией @Resource.

2 сценария, которые мне трудно понять (первый сценарий исправлен, см. обновление)...

Управляемый контейнером MDB: Драйвер DataSource не совместим с XA, поэтому я включил "Last Participant Support" в WebSphere. Тем не менее, когда тип транзакции MDB установлен на Container, я получаю ошибку при фиксации:

[11/28/11 10:56:10:988 MST] 0000002e RegisteredRes E   WTRN0063E: An illegal attempt to commit a one phase capable resource with existing two phase capable resources has occurred.

Может быть, это происходит потому, что после фиксации DataSource возвращается к MessageListener, который фиксирует, делая его последним участником? Я полагаю, что поставщик сообщений по умолчанию в WAS 7 совместим с XA, хотя я не видел никакой документации, в которой об этом прямо говорится.

Сообщение повторяется еще 4 раза сразу после первой ошибки (хотя согласно ActivationSpec в WebSphere должна быть 30-секундная задержка). Каждый раз возникает одна и та же ошибка. Согласно MessageListener она завершилась без ошибок, так что эта ошибка является частью замечательной невидимой транзакции, управляемой контейнером. Я не думаю, что мне нужны глобальные транзакции XA, так как есть только один DataSource, помимо JMS, я обрабатывал откат транзакции программно. Также JMS msg, MDB является асинхронным, AUTO-ACKNOWLEDGE. Как только сообщение было получено, его можно квитировать.

Если я ввожу ошибку приложения, так что возникает Exception, я вижу эту ошибку 5 раз немедленно (без задержки):

[11/28/11 10:16:18:857 MST] 0000002b LocalExceptio E   CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "onMessage" on bean...

Поэтому я перешел на................

Bean Managed MDB: Commit работает без ошибки XA и происходит только один раз. Однако обработка ошибок все еще ведет себя не так, как я ожидаю или хочу! В классе MessageListener пойманные исключения бросают исключение EJB, которое, как я думаю, должно вызвать желаемое поведение MDB: Причина исключения не имеет значения для меня, когда MDB бросает пойманное Исключение, разве MDB не должен быть повторно опробован в соответствии со свойствами в WebSphereActivationSpec? Вместо этого сообщение идет к MessageListener 5 раз, немедленно бросая ту же ошибку, что и Container Managed MDB: "EJB бросил неожиданное (необъявленное) исключение..."

Если я бросаю RuntimeException, то сообщение "неиспользованный (необъявленный) исключение" не происходит, но сообщение все равно повторяется 4 раза немедленно, вместо ожидания задержки повторной попытки.

Спасибо за прочтение, любая помощь или понимание будут высоко оценены!

UPDATE: В итоге я решил проблему совместимости с XA, переключив источник данных на совместимый с XA. В консоли администратора WAS: Resources->JDBC Providers->DB2 Universal JDBC Driver Provider->Change implementation class name to: com.ibm.db2.jcc.DB2XADataSource

У меня все еще та же проблема, когда сообщение не работает. Оно повторяется немедленно, а не в соответствии с ActivationSpec в WAS.

8
задан Morgan Dowell 1 December 2011 в 01:14
поделиться