2016-11-01 12 views
1

Код ...Насколько надежным является откат JMS?

@Transactional 
@JmsListener(destination = "QueueA") 
public void process(String input) { 
    doSomethingWhichMayThrowException(input); 
} 

Рассмотрим следующую ситуацию где ...

  1. Сделка запускается (с использованием Spring @Transactional аннотацию)
  2. Persistent сообщение JMS считывается из QueueA (использование очереди диска как хранилище сообщений)
  3. Диск заполнен и не принимает никаких операций записи
  4. Исключение происходит, и транзакция откатывается

потерял ли сообщение?

Если это не то, как сообщение считывается из очереди по транзакции (шаг 2)?

Используется ли какой-то браузер очереди, поэтому сообщение читается из очереди, но не используется?

+0

зависит от поставщика, но обычно он работает с ack от драйвера до messagebroker. –

ответ

1

Сообщение потеряно?

Нет, сообщение не будет потеряно, так как транзакция отката.

Если это не тогда, как сообщение считывается из очереди по транзакции (шаг 2)?

Однажды после process()/onMessage() метод в сообщении слушателя завершается, и возвращаются с успехом или исключением, то внутренне подтверждением сообщений (по умолчанию AUTO_ACKNOWLEDGE) происходит (что это последнее, что неявно происходит) к провайдеру JMS (IBMMQ, ActiveMQ, SonicMQ и т. Д.), В котором говорится, что транзакция успешна или нет.

Если транзакция прошла успешно, поставщик JMS удаляет сообщение из очереди/темы.

Если транзакция НЕ выполнена, поставщик JMS сохраняет сообщение как есть (до истечения срока сообщения TimetoLive).

Используется ли какой-то браузер очереди, поэтому сообщение читается из очереди, но не потребляется?

Вы можете думать, что это похоже на концепцию браузера для очереди, но реализация JMS-провайдера не является реализацией этого процесса. Чтобы достичь этого, брокер сообщений просто считывает содержимое сообщения, но не удаляет фактическое сообщение из очереди/темы до тех пор, пока подтверждение не будет получено из метода process()/onMessage() процесса прослушивания сообщения для текущей транзакции.