我知道这是一个经常被问到的问题,但我的问题似乎有点不同。
简短介绍:
我有一个针对队列进行轮询的DMLC
之后,消息通过DirectChannel发送到链。
在链中,我使用 unmarshalling-transformer (转换传入xml到interface-object)。
然后再次执行不同的步骤(验证等,全部通过DirectChannel),在流程结束时,我想将(已转换的)消息插入数据库。
在下面的流程中,有不同的“错误来源”。例如,输入消息不正确,无法转换(解组)到对象中。或者无法实现数据库插入记录。
现在有关不同错误类型的问题:
如果输入消息无法转换或数据验证产生错误,我想向错误通道发送错误消息(或异常),因为它没有意义回滚邮件。
如果数据库插入失败(可能是由于“系统挂起”),我想回滚消息到输入队列(peInputQueue)。
从config-xml中附上一个snipplet:
<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-richher”(请参阅chain-element)中的标头增强为errorChannel。
在“validationBean”中,我识别出MessageHeaders中的errorChannel,但不幸的是它不起作用。
而不是这样,启动回滚。 :-(
那么我怎样才能达到(我的)期望的解决方案。
任何帮助都非常感谢
亲切的问候,
博多
答案 0 :(得分:0)
error-channel
标头无法访问。因为一切都在同一个线程中,所以,抛出的异常就像常规Java一样。
异常会在ChannelPublishingJmsMessageListener.GatewayDelegate
。
由于根据您的配置没有error-channel
,因此会重新抛出DefaultMessageListenerContainer
以进行rallback。
所以,您应该在error-channel
上进行<jms:message-driven-channel-adapter>
配置,并且还应该添加一些ErrorHandler
来切断&#34; rallback或不#34}逻辑。