2014-06-26 4 views
0

Я новичок в JMS и буду благодарен вам за помощь.JMS и «транзакционные сообщения»

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

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

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

ответ

1

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

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

createSession(false, Session.CLIENT_ACKNOWLEDGE); 

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

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

Смежные вопросы