JMS-синхронизация запроса-ответа от EJB без сохранения состояния - PullRequest
0 голосов
/ 11 октября 2010

У меня есть система, основанная на очередях JMS, которые позволяют всей системе работать асинхронно.

Теперь для некоторых периодических задач мне нужно синхронизировать некоторые не трудоемкие задачи, чтобы я мог сразу что-то сделать с результатом, не используя базу данных для хранения запроса и сопряжения его с результатом (как в случае асинхронной синхронизации). операция).

Сам код не является проблемой, но тот факт, что EJB-компоненты выполняют контейнерные транзакции, а это означает, что код provider.send () и consumer.receive () не будут выполняться последовательно (т.е. сообщение не отправляется, поэтому ничего получить в получения () несколько строк ниже).

Как можно отправить сообщение JMS и получить синхронизированный ответ в среде EJB3 без сохранения состояния?

Спасибо за ответы,

бозо

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Вы должны знать о контекстах транзакций в EJB, которые влияют на отправку сообщений запроса / ответа через JMS.

"Решением будет приостановка транзакции, создание новой транзакции, отправка запроса, принятие новой транзакции, отмена приостановки первой транзакции и продолжение."

В приведенном ниже URL-адресе вы найдете формулировку проблемы и решение. Кстати, это относится как к транзакциям, управляемым контейнером, так и к транзакциям, управляемым компонентом.

http://blogs.oracle.com/fkieviet/entry/request_reply_from_an_ejb

1 голос
/ 12 октября 2010

Вы можете переключить свой компонент на использование транзакций, управляемых компонентом.

@MessageDriven
@TransactionManagement(BEAN)
public class MyMDB implements MessageListener {

  // this is optional
  @Resource
  private UserTransaction ut;

  //...

}
...