Обработка транзакций при использовании управляемого каналом адаптера сообщений и активатора сервиса

Я работаю над POC, который делает следующее

  1. Использует управляемый сообщениями адаптер канала для получения сообщения в транзакции
  2. Вызывает активатор службы, который использует обработчик для вставки сообщения, полученного от адаптера, в базу данных, а также для отправки сообщения в исходящий канал.

Теперь, если вставка в БД сообщения не удалась, я хочу, чтобы сообщение JMS вернулось в очередь, чтобы его можно было повторить позже.

С моей приведенной ниже конфигурацией, похоже, она не работает.(Т.е. даже если при вставке в базу данных произошел сбой, сообщение удаляется из очереди.

Любые указатели или примеры конфигурации будут полезны.

<integration:channel id="jmsInChannel">         
    <integration:queue/>
</integration:channel>

<int-jms:message-driven-channel-adapter id="jmsIn"
    transaction-manager="transactionManager"
    connection-factory="sConnectionFactory"
    destination-name="emsQueue"
    acknowledge="client" channel="jmsInChannel"
    extract-payload="false"/>   

<integration:service-activator input-channel="jmsInChannel"
    output-channel="fileNamesChannel" ref="handler" method="process" />

<bean id="handler" class="com.irebalpoc.integration.MessageProcessor">
    <property name="jobHashTable" ref="jobsMapping" />
</bean>

1 ответ

Решение

Установите подтверждение ="транзакция", и я предполагаю, что транзакция Manager является менеджером транзакций JDBC (или JTA).

Вам также необходимо удалить из JmsInChannel, чтобы транзакция базы данных происходила в том же потоке.

Spring синхронизирует транзакцию базы данных с транзакцией JMS.

Тем не менее, прочитайте http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html за последствия.

Если вы не можете сделать свой сервис идемпотентным, вам, возможно, придется обратиться к менеджеру транзакций XA.

Другие вопросы по тегам