我必须分析下面给出的一个Spring集成代码:
<int:channel id="errorChannel" />
<int:exception-type-router input-channel="errorChannel"
default-output-channel="otherError">
<int:mapping
exception-type="MessageRejectedException"
channel="mreError" />
</int:exception-type-router>
<int:channel id="otherError" />
<int:transformer input-channel="otherError"
ref="otherExceptionTransformer" output-channel="errors" />
<bean id="otherExceptionTransformer"
class="OtherExceptionTransformer">
</bean>
<int:channel id="mreError" />
<int:transformer input-channel="mreError"
ref="mreExceptionTransformer" output-channel="errors" />
<bean id="mreExceptionTransformer"
class="MessageRejectedExceptionTransformer">
</bean>
<int:channel id="errors"/>
<int-jms:outbound-channel-adapter channel="errors"
connection-factory="connectionFactory" destination-
name="${myQueue.inbound.comp2}"/>
MessageRejectedExceptionTransformer作为MessagingException对象的输入,但是OtherExceptionTransformer将ErrorMessage对象作为输入。
到目前为止我所理解的是MessagingException包含failedMessage和异常的原因, 而ErrorMessage应包含Message类型。
现在,我担心的主要问题是,我不了解在哪种情况下,我不会收到MessagingException对象。
我试图从我的代码中抛出nullPointerException和IllegalArgumentException,并将spring处理为仅Messaging Exception。所以我想知道otherError通道什么时候会收到一条消息。
有没有人对此有看法?
答案 0 :(得分:2)
ErrorMessage
的有效负载为MessagingException
,其中包含两个属性:failedMessage
和cause
(原始异常)。
如果消费者(例如变压器)的参数为MessagingException
,则框架会从消息中解除有效负载并调用它。如果消费者接收消息(或ErrorMessage
),则使用原始消息调用它。
您的路由器专门在MessageRejectedException
上路由,MessagingException
是MessagingException
的子类。
如果抛出任何其他{{1}},将采取其他路线。