Spring integration Spring集成异常忽略int jms:消息驱动通道适配器上的容器设置

Spring integration Spring集成异常忽略int jms:消息驱动通道适配器上的容器设置,spring-integration,Spring Integration,据我所知,ServiceActivator中的运行时异常应该向errorChannel发送消息 但是如果没有设置errorHandler,那么它就不起作用。我甚至试着设置errorHandler 但在myProcess(ServiceActivator)中的RuntimeException上,我在日志中看到以下内容 WARN:[2014-03-16 00:11:51.219]org.springframework.jms.listener.DefaultMessageListenerCont

据我所知,ServiceActivator中的运行时异常应该向errorChannel发送消息

但是如果没有设置errorHandler,那么它就不起作用。我甚至试着设置errorHandler


但在myProcess(ServiceActivator)中的RuntimeException上,我在日志中看到以下内容

WARN:[2014-03-16 00:11:51.219]org.springframework.jms.listener.DefaultMessageListenerContainer-执行jms消息侦听器失败,未设置错误处理程序。
org.springframework.integration.MessaginException:无法处理传入的JMS消息
位于org.springframework.integration.jms.SubscribableJmsChannel$DispatchingMessageListener.onMessage(SubscribableJmsChannel.java:164)
位于org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:561)
位于org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:499)
位于org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:467)
位于org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)
位于org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)
位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1059)
位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1051)
位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:948)
运行(Thread.java:662)
我调试了DefaultMessageListenerContainer、JmsMessageDrivenEndpointParser和其他一些内部类,发现容器设置正确

但当抛出异常时,它使用的是默认容器(不是我在int-jms:message-driven-channeladapter:translatorContainer上设置的容器,它设置了errorHandler)

原因可能是什么?是否有其他替代设置可以尝试将运行时异常重定向到errorChannel?如果您需要更多信息,请告诉我

我使用的是spring集成版本2.2.5

####详细配置

${mq_主机名}
${mq_端口}
${mq_queuemanager}
${mq_通道}
真的
使用重试模板解决此问题
正如我们从StackTrace中看到的,问题是关于
SubscribableJmsChannel
),您不使用自定义的
容器

但是您显示了
的配置

所以,仔细分析这个问题


现在,如果您希望
具有相同的行为,可以将
myErrorHandler
插入通道的属性
错误处理程序

My setup 1)网关(入站-JMS-channel)2)拆分器(输入:入站-JMS-channel输出:拆分器通道)3)服务激活器(输入:拆分器通道输出:已翻译的通道)4)SERVICE ACTIVATOR(输入:已翻译通道)到输出通道的代码基路由运行时异常在SERVICE ACTIVATOR中,我没有任何jms通道。步骤3的运行时异常将消息放回步骤1。为什么?入站消息通道是INTJMS:所以根据您的建议,我添加了errorHandler,现在调用了errorHandler,但消息仍然返回到入站原始队列,而不是从队列中删除。这个配置是否错误?所以基本上信息是循环的。让我知道您的想法。请显示正确的配置(以及所有配置)。很明显,堆栈跟踪来自不同的流。什么是网关(入站JMS通道)?jms:channel不是网关。为什么要使用通道而不是通道适配器来启动流?通道不是为此目的而设计的。您的消息将返回到队列,因为JMS本质上是事务性的
ErrorHandler
只是处理该错误的一个钩子,但是对于有问题的消息保持
commit
没有帮助。您应该在服务激活器中的某个位置“扼杀”异常,以允许提交JMS事务。@GaryRussell我在原始消息中添加了详细配置。网关的请求通道是INBOUND-JMS-channel。实际上,网关用于测试。外部系统将向入站队列写入消息,所以我将把它更改为消息驱动通道适配器。对于当前场景,我已经尝试更改为适配器,结果是相同的。