Обработка транзакций при использовании управляемого каналом адаптера сообщений и активатора сервиса
Я работаю над POC, который делает следующее
- Использует управляемый сообщениями адаптер канала для получения сообщения в транзакции
- Вызывает активатор службы, который использует обработчик для вставки сообщения, полученного от адаптера, в базу данных, а также для отправки сообщения в исходящий канал.
Теперь, если вставка в БД сообщения не удалась, я хочу, чтобы сообщение 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).
Вам также необходимо удалить
Spring синхронизирует транзакцию базы данных с транзакцией JMS.
Тем не менее, прочитайте http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html за последствия.
Если вы не можете сделать свой сервис идемпотентным, вам, возможно, придется обратиться к менеджеру транзакций XA.