JMS и «транзакционные сообщения»

#java #jms

#java #jms

Вопрос:

Я новичок в JMS и был бы признателен за вашу помощь.

Все, что я читал о JMS, создает у меня впечатление, что объект, который «содержит транзакцию», является объектом сеанса, что означает, что когда мы «session.commit()», все, что произошло с момента последнего коммита, урегулировано.

Мой вопрос касается того, как обрабатывать скороговорку, в которой я хочу «передавать сообщения», а не сеанс. Представьте, что вы хотите получить большое количество сделок в очень параллельном сценарии, и после получения любого отдельного сообщения и обработки вы хотели бы «message.commit()». Как мы можем реализовать этот сценарий?
Должен ли я продолжать создавать QueueSessions для каждого сообщения, которое я хотел удалить из очереди? Не слишком ли много накладных расходов?

Заранее спасибо

Ответ №1:

Это правильно, объект сеанса JMS отвечает за управление транзакциями. Сеанс.Вызов Commit() фиксирует все сообщения, полученные / отправленные в этом сеансе. Аналогично сессии.Rollback() выполняет откат сообщений в сеансе.

Для вашего требования вы можете использовать сеанс без транзакций с опцией CLIENT_ACKNOWLEDGE. Нравится:

 createSession(false, Session.CLIENT_ACKNOWLEDGE);
  

Сеанс CLIENT_ACKNOWLEDGE позволяет вам создать сообщение.Подтвердите, что сообщает поставщику сообщений удалить это сообщение из очереди / темы.

Но вы должны иметь в виду, что реализация message.Подтверждение зависит от реализации. Некоторые поставщики обмена сообщениями позволяют каждому сообщению подтверждать, где, поскольку другие подтверждают все сообщения. При подтверждении каждого сообщения только сообщение, для которого вызывается подтверждение, будет удалено из поставщика обмена сообщениями. Все другие сообщения, полученные и не подтвержденные, не будут удалены. Где, как и в реализации типа «подтвердить все», вызов подтверждения для одного сообщения подтвердит все сообщения, полученные ранее. Это то же самое, что и выполнение session.commit в транзакционном сеансе.