Как асинхронно публиковать новые сообщения JMS после обработки входящего сообщения?

У нас есть сценарий, в котором после обработки входящего сообщения A с помощью компонента, управляемого сообщениями, мы записываем последующее сообщение B в другую очередь. Мы используем Glassfish 3.1.

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

Вторая цель состоит в том, что отправка сообщения B не должна блокировать или расширять область действия транзакции, охватывающей сообщение A. Мы хотели бы, чтобы транзакция, охватывающая сообщение A, была закрыта как можно скорее и не оставалась открытой, пока обрабатывается сообщение B.

Одна из идей состоит в том, чтобы создать специальный EJB с методом, помеченным для этой цели @Asynchronous, и найти и вызвать этот EJB в конце onMessage(). Однако мы не уверены, что это лучшая практика в данном случае.

Мы не заинтересованы во внедрении дополнительного решения для оркестровки (например, ESB), которое бы справилось с этим и более сложными случаями.


person user677891    schedule 06.05.2011    source источник


Ответы (1)


Ты это пробовал?

Насколько я понимаю, MDB находятся в своих собственных транзакциях. Таким образом, проблема с B не приведет к откату A. Это должно быть поведением по умолчанию.

person Preston    schedule 06.05.2011
comment
У нас есть две проблемы, которые мы пытаемся решить. Во-первых, нам не нужна транзакция для обработки сообщения A в onMessage(), чтобы покрыть все, что мы делаем с сообщением B. Мы также не хотим, чтобы какие-либо исключения, возникающие при обработке сообщения B, исчезали и приводили к откату сообщения A. Об этой части мы можем позаботиться, проявляя осторожность при обработке исключений. Вторая проблема заключается в том, что мы хотим, чтобы сообщение A было обработано как можно скорее, а любые ресурсы (например, db) были освобождены как можно быстрее, поэтому мы хотели бы отправить сообщение B вне транзакции, охватывающей сообщение A. - person user677891; 09.05.2011
comment
Вы хотите разделить отправку сообщения или потребление сообщения? Вы говорите, что хотите, чтобы A отправил B, но вы не хотите, чтобы представление было частью транзакции A? Если да, то почему? - person Preston; 09.05.2011