Таким образом, установка следующее:Весна интеграции и JDBC в одной транзакции
<tx:advice id="txAdvice2" transaction-manager="dataSourceTransactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="Throwable" no-rollback-for="ListenerExecutionFailedException"/>
</tx:attributes>
</tx:advice>
<int-amqp:inbound-channel-adapter channel="input-channel" queue-names="probni" message-converter="jsonMessageConverter"
channel-transacted="true"
advice-chain="txAdvice2" />
<int:chain input-channel="input-channel" output-channel="output-channel">
<int:service-activator ref="h1Handler" method="handle" />
<int:service-activator ref="h2Handler" method="handle" />
<int:service-activator ref="h3Handler" method="handle" />
<int:splitter />
</int:chain>
<int-amqp:outbound-channel-adapter channel="output-channel" exchange-name="outputit" amqp-template="rabbitTemplate" />
Если во время выполнения этой нити (так как все это цепь amqpIN-процесс-amqpOUT shold выполнить в одном потоке) кидаю ListenerExecutionFailedException, dataSourceTransactionManager выполнит фиксацию, но amqp также запросит сообщение, потому что исключение распространяется.
Как я могу сказать кролику, чтобы сообщение ACK было успешным в этом случае?
Кроме того, я увидел, что мне нужно было установить класс исключительных исключений атрибута no-rollback-for, поскольку мое внутреннее исключение хранится только в атрибуте «причина», который не проверяется атрибутом RuleBasedTransactionAttribute. более
Одна вещь, если я конфиг так:
<int-amqp:inbound-channel-adapter channel="input-channel" queue-names="probni" message-converter="jsonMessageConverter"
channel-transacted="true"
transaction-manager="dataSourceTransactionManager"
transaction-attribute="transactionAttribute" />
transactionAttribute который RuleBasedTransactionAttribute не считается вообще и dataSourceTransactionManager всегда rollbacked, даже если у меня нет-откат-за не установлены правильно.
Спасибо!
Вам не нужно обертывать исключение; см. мое редактирование. Кроме того, вы можете использовать атрибут 'error-handler'. –
Спасибо за быстрый ответ. Попробуем это завтра.Если я отклонюAndDontRequeue - это закончится в DeadLetterQueue? Я бы хотел, чтобы это рассматривалось как обычный ACK, так как я хочу сделать это, если сообщение будет повторно отправлено (доставлено хотя бы один раз +, возможно, больше). Вы знаете, кстати, почему атрибут транзакции не работает с транзакцией при поставке внутри входящего канала-adater, но работает, если применяется в качестве совета? (Вторая часть вопроса). –
То есть, если сообщение повторно отправлено, но jdbc уже завершен, я хочу выставить исключение, которое будет откатывать jdbc, но вы получите сообщение о кролике (так как я делаю commit и ack в конце конвейера обработки). –