Spring集成 - 异常和重试

时间:2017-06-29 21:22:24

标签: java spring-integration spring-retry

我的设置:
我有一个使用ActiveMQ的消息守护进程,它将消耗JSON消息 JSON消息的发布者为type添加了带有值的标头,例如com.example.Foo,这是json消息的类型。我用它来将json转换为pojo。

Spring配置:
一旦收到消息,这些是它经历的步骤:
1.变形金刚:将json变换为pojo
2.有效载荷类型路由器:根据pojo的类型,将pojo路由到适当的服务激活器 3.服务激活器:处理消息。

<int:chain input-channel="transformerChannel">
    <int:transformer id="jsonToPojoTransformer" ref="JsonToPojoTransformer" method="transform" />

    <int:payload-type-router default-output-channel="defaultChannel">
        <int:mapping type="com.example.Foo" channel="fooHandlerChannel"/>
        <int:mapping type="com.example.Bar" channel="barHandlerChannel"/>
    </int:payload-type-router>
</int:chain>

<int:service-activator input-channel="fooHandlerChannel" ref="fooHandler" method="onMessage"/>
<int:service-activator input-channel="barHandlerChannel" ref="barHandler" method="onMessage"/>

服务激活器定义:

public class FooHandler {
    public void onMessage(Foo foo) {...}
}

问题:

  1. 我想知道如何访问服务激活器中的邮件头。似乎服务激活器无法访问消息头,因为变换器正在返回pojo。

  2. 假设服务激活器因任何原因无法呼叫下游休息服务。我想现在跳过处理此消息,我想稍后重试此消息。或者假设处理此消息时有异常。我想在一段时间后重试处理此消息。我该如何做到这一点?

  3. - edit--
    根据Artem的评论删除了细节以减少问题大小。

1 个答案:

答案 0 :(得分:0)

请尝试不要在这里做太长的话题。如果有很多问题,很难回答特定的问题。

绝对不清楚为什么您无法通过服务激活方法访问标头。您可以接受整个Message<>,并调用其getHeaders(). You can use @标题annotation on the地图arg to get headers from the message. You can use @ Header`注释,从邮件中提取确切的特定标题。

即使你的变换器方法只返回一个POJO,并不意味着它没有包含在Message中,而是带有来自requestMessage的标题。如果您需要在POJO旁边返回特定标题,则应使用Message自行创建MessageBuilder并且不要忘记复制requestMessage标头,因为变压器不会复制请求如果返回整个消息,则为标题。

您必须在JMS使用者身上支持TX,以便RuntimeException将导致回滚,并最终重新发送。并且您应该确保所有流程都在同一个线程中执行。否则TX被提交并且消息在代理上被激活。如果您没有交易,也会发生同样的情况。