ErrorChannel 未在不同步骤中填充
ErrorChannel is not filled within different steps
我知道这是一个经常被问到的问题,但我的问题似乎有点不同。
简介:
我有一个针对 queue.
进行轮询的 DMLC
之后,消息通过 DirectChannel 发送到 chain。
在 chain 中,我使用 unmarshalling-transformer(将传入的xml转化为interface-object)。
然后又是不同的步骤(验证等,全部通过 DirectChannel),在流程结束时我想将(转换后的)消息插入数据库。
在下面的流程中有不同的"error sources"。例如,输入消息不正确,无法转换(解组)为 object。或者数据库无法实现插入记录。
现在关于不同错误类型的问题:
如果无法转换输入消息或数据验证产生错误,我想将 error-message (或异常)发送到 error-channel因为回滚消息没有意义。
如果 database-insert 失败(可能是由于 "system hang"),我想 回滚 消息到输入 queue (peInputQueue).
附上来自 config-xml 的一个片段:
<jms:message-driven-channel-adapter id="peMessageDrivenAdapter"
channel="jmsHeaderEnricherChannel"
acknowledge="transacted"
connection-factory="jmsTransactionConnectionFactory"
concurrent-consumers="1"
max-concurrent-consumers="5"
max-messages-per-task="5"
receive-timeout="500"
auto-startup="true"
destination="peInputQueue" />
<int:chain id="jmsInputChain" input-channel="jmsHeaderEnricherChannel" output-channel="routerTransformChannel">
<int:header-enricher>
<int:priority value="#{T(de.axa.batch.ecmcm.cmab.util.CmabConstants).LOW_PRIO}"/>
<int:header name="countMessage" ref="counter" />
<int:header name="protocol" value="jms"/>
<int:header name="msgReceiveDate" expression="T(System).currentTimeMillis()" />
<int:error-channel ref="errorChannel"/>
</int:header-enricher>
<int-xml:unmarshalling-transformer id="jmsModelUnmarshallerTransformer" unmarshaller="jmsModelUnmarshaller"/>
</int:chain>
<int:header-value-router input-channel="routerTransformChannel" header-name="protocol">
<int:mapping value="jms" channel="jmsTransformToCoreChannel"/>
</int:header-value-router>
<int:transformer id="jmsToCoreTransformer" input-channel="jmsTransformToCoreChannel"
ref="cmabInboundQueueMapper" output-channel="validationChannel"/>
<int:service-activator input-channel="validationChannel"
output-channel="processChannel"
ref="validationBean" />
<int:service-activator input-channel="processChannel" ref="databaseProcess"/>
在上面的配置中,如果每个示例 "validationBean" 抛出异常,则回滚消息。
但这并不是我所期望的。我想将消息调整到错误通道中。因此,我将 "header-enricher"(参见 chain-element)中的 header 增强为 errorChannel。
在 "validationBean" 中,我识别出 MessageHeaders 中的 errorChannel,但不幸的是它不起作用。
取而代之的是启动回滚。 :-(
那么我怎样才能实现(我的)想要的解决方案。
非常感谢任何帮助。
亲切的问候,
博多
无法访问 error-channel
header。正因为一切都在同一个线程中,所以,就像常规 Java.
一样抛出异常
异常在 ChannelPublishingJmsMessageListener.GatewayDelegate
.
中被捕获
并且由于根据您的配置没有 error-channel
因此 re-thrown 到 DefaultMessageListenerContainer
进行回滚。
因此,您应该在 <jms:message-driven-channel-adapter>
上进行 error-channel
配置,还应该添加一些 ErrorHandler
来切断 "rallback or not" 逻辑。
我知道这是一个经常被问到的问题,但我的问题似乎有点不同。
简介:
我有一个针对 queue.
进行轮询的 DMLC
之后,消息通过 DirectChannel 发送到 chain。
在 chain 中,我使用 unmarshalling-transformer(将传入的xml转化为interface-object)。
然后又是不同的步骤(验证等,全部通过 DirectChannel),在流程结束时我想将(转换后的)消息插入数据库。
在下面的流程中有不同的"error sources"。例如,输入消息不正确,无法转换(解组)为 object。或者数据库无法实现插入记录。
现在关于不同错误类型的问题:
如果无法转换输入消息或数据验证产生错误,我想将 error-message (或异常)发送到 error-channel因为回滚消息没有意义。
如果 database-insert 失败(可能是由于 "system hang"),我想 回滚 消息到输入 queue (peInputQueue).
附上来自 config-xml 的一个片段:
<jms:message-driven-channel-adapter id="peMessageDrivenAdapter"
channel="jmsHeaderEnricherChannel"
acknowledge="transacted"
connection-factory="jmsTransactionConnectionFactory"
concurrent-consumers="1"
max-concurrent-consumers="5"
max-messages-per-task="5"
receive-timeout="500"
auto-startup="true"
destination="peInputQueue" />
<int:chain id="jmsInputChain" input-channel="jmsHeaderEnricherChannel" output-channel="routerTransformChannel">
<int:header-enricher>
<int:priority value="#{T(de.axa.batch.ecmcm.cmab.util.CmabConstants).LOW_PRIO}"/>
<int:header name="countMessage" ref="counter" />
<int:header name="protocol" value="jms"/>
<int:header name="msgReceiveDate" expression="T(System).currentTimeMillis()" />
<int:error-channel ref="errorChannel"/>
</int:header-enricher>
<int-xml:unmarshalling-transformer id="jmsModelUnmarshallerTransformer" unmarshaller="jmsModelUnmarshaller"/>
</int:chain>
<int:header-value-router input-channel="routerTransformChannel" header-name="protocol">
<int:mapping value="jms" channel="jmsTransformToCoreChannel"/>
</int:header-value-router>
<int:transformer id="jmsToCoreTransformer" input-channel="jmsTransformToCoreChannel"
ref="cmabInboundQueueMapper" output-channel="validationChannel"/>
<int:service-activator input-channel="validationChannel"
output-channel="processChannel"
ref="validationBean" />
<int:service-activator input-channel="processChannel" ref="databaseProcess"/>
在上面的配置中,如果每个示例 "validationBean" 抛出异常,则回滚消息。
但这并不是我所期望的。我想将消息调整到错误通道中。因此,我将 "header-enricher"(参见 chain-element)中的 header 增强为 errorChannel。
在 "validationBean" 中,我识别出 MessageHeaders 中的 errorChannel,但不幸的是它不起作用。
取而代之的是启动回滚。 :-(
那么我怎样才能实现(我的)想要的解决方案。
非常感谢任何帮助。
亲切的问候,
博多
无法访问
error-channel
header。正因为一切都在同一个线程中,所以,就像常规 Java. 一样抛出异常
异常在
ChannelPublishingJmsMessageListener.GatewayDelegate
. 中被捕获
并且由于根据您的配置没有
error-channel
因此 re-thrown 到DefaultMessageListenerContainer
进行回滚。
因此,您应该在 <jms:message-driven-channel-adapter>
上进行 error-channel
配置,还应该添加一些 ErrorHandler
来切断 "rallback or not" 逻辑。