JBoss не отправляет сообщение JmsTemplate (Spring) - PullRequest
2 голосов
/ 22 июня 2009

Ну, на самом деле JBoss отправляет сообщение, но только когда текущая транзакция, запущенная EJB, завершена.

У нас есть эта проблема с JBoss 4.0.3 и Spring JmsTemplate. EJB отправляет сообщение в очередь с временной очередью в качестве поля reply_to. Затем внутри той же транзакции мы слушаем ответ, полученный первым MDB. Проблема в том, что метод JMSTemplate "send" не выполняется после завершения транзакции. Таким образом, к тому времени, когда сообщение отправляется в очередь и обрабатывается MDB, прослушиватель временной очереди исчезает.

Это называется "Синхронный прием"

Две вещи меняют это поведение, но вызывают некоторые опасения:

  1. Измените тип транзакции EJB на BMT. (Концерн: BMT отстой)

  2. Создайте поток, который все, что он делает, это вызывает метод JmsTemplate.send ().

В качестве примечания следует, что это EJB-компонент, который корректно работает в среде weblogic, и сообщение отправляется, когда это необходимо, в середине транзакции, а не после ее завершения.

Спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 22 июня 2009

JBoss ведет себя правильно. JMS является транзакционным API, и отправка должна выполняться только при фиксации передачи.

Возможно, удастся убедить JmsTemplate не использовать текущий транзакционный контекст, хотя это имеет смысл попытаться скрыть от вас неприятности JMS API.

0 голосов
/ 05 ноября 2009

Вы можете заключить шаблон JMS в код, либо сессионный компонент без сохранения состояния, либо метод сервиса, использующий управление транзакциями Spring, который использует распространение транзакции REQUIRES_NEW. Таким образом, отправка сообщения осуществляется в его собственной транзакции, которая передаст отправку сообщения за пределы транзакции переноса.

Я не уверен, почему это будет работать на Weblogic, хотя. Я думаю, что в Weblogic он не распознает очередь как очередь XA.

...