百度网站开发业务石家庄百度搜索优化
我通过Atomikos和JMS使用Spring Integration和JTA支持绑定到不同的Webshpere MQ和Oracle数据库 .
对于其他人而言,它似乎与_2732233中的线程相同,但它根本不是 .
流程如下:
message-driven-channel-adapter接收事务内的消息
一些转变
ServiceActivator具有更深层次的业务逻辑
数据库更新
对于一个szenario来说,一切都很顺利:
如果在ServiceActivator中发生未经检查的异常(可能是由于不应该存在的不一致数据),则会在ErrorHandler(通过ErrorChannel)中重新抛出并处理该消息 . 在某些情况下,应该将orgininal传入消息发送到DeadLetter队列(Webshere MQ) . 这是通过出站通道适配器完成的 .
见封闭配置:
channel="midxReplyChannel"
acknowledge="auto"
transaction-manager="transactionManager"
connection-factory="connectionFactory"
concurrent-consumers="1"
error-channel="errorChannel"
max-concurrent-consumers="${cmab.integration.midx.max.consumer}"
idle-task-execution-limit="${cmab.integration.midx.idleTaskExecutionLimit}"
receive-timeout="${cmab.integration.midx.receiveTimeout}"
destination="midxReplyQueue"/>
................
channel="errorDlChannel" destination="deadLetterQueue"
delivery-persistent="true" connection-factory="nonXAConnectionFactory"/>
Some important hints: 消息驱动通道适配器:
connectionFactory是一个MQXAQueueConnectionFactory,它与AtomikosConnectionFactoryBean相连
transaction-manager是Spring JtaTransactionManager
出站通道适配器:
connection-factory是一个非XAConnectionFactory .
CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
.....
cachingConnectionFactory.setTargetConnectionFactory(mqQueueConnectionFactory);
return cachingConnectionFactory;
And now the error which I observed:
虽然我在ErrorHandler中处理了未经检查的异常(ref = "inputErrorHandler";将消息发送到DeadLetter-Queue),但是启动了回滚,并且消息驱动通道适配器一次又一次地接收消息 .
实际上,消息是通过出站通道适配器传递给DeadLetterQueue的事实 . 目标(deadLetterQueue)包含失败的消息 .
问题:我做错了什么?虽然我在ErrorHandler中处理了异常,但回滚失败的原始传入消息 .
任何帮助真的很感激 . 提前谢谢了 .