Как откатить сообщение, полученное из IBM MQ, при весенней интеграции

У меня есть такой поток интеграции Spring:

    1) message-driven-channel-adapter -> 
                 1.1) output-channel connected to -> service-activator -> outbound-channel-adapter (for sending response)
                 1.2) error-channel connected to -> exception-type-router 
                            1.2.1) message is sent to different queues depending on the exception type using outbound-channel-adapter

Я установил подтверждение = "транзакция" в адаптере канала, управляемого сообщениями. Я хочу ввести откат для определенного типа исключения после канала ошибки.

Сначала я попытался подключить выход маршрутизатора типа исключения к активатору службы. Но я получаю исключение:

   Code: 

     <service-activator id="rollBackActivator" input-channel="RollBackChannel" 
             ref="errorTransformer" method="rollBackMessage"/>

     public void rollBackMessage(MessagingException  message){       
         TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
     System.out.println("Message rolled back:"+TransactionAspectSupport.currentTransactionStatus().isRollbackOnly());
 }

   Exception:
   org.springframework.messaging.MessageHandlingException: org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope

Затем я попытался с выражением адаптера исходящего канала, но снова получил другое исключение

Code:
<outbound-channel-adapter id="rollbackOut" channel="RollBackChannel" 
     expression="T(org.springframework.transaction.interceptor.TransactionAspectSupport).currentTransactionStatus().setRollbackOnly()"/>

 Exception:
 org.springframework.messaging.MessageHandlingException: Expression evaluation failed: T(org.springframework.transaction.interceptor.TransactionAspectSupport).currentTransactionStatus().setRollbackOnly()

Посоветуйте, пожалуйста, реализовать откат в этом сценарии.


person Vidya_85    schedule 27.10.2014    source источник


Ответы (1)


По умолчанию контейнер использует локальные транзакции в сеансе. Здесь нет никакого АОП. Просто создайте исключение, и контейнер откатит сообщение.

person Gary Russell    schedule 27.10.2014
comment
Спасибо, Гэри. Я могу откатить сообщение, выдав исключение. - person Vidya_85; 31.10.2014