2017-06-29 113 views
1

我的设置:
我有一个消息守护进程使用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. 可以说服务激活器无论出于何种原因都无法调用下游休息服务。我现在要跳过处理此消息,并且稍后要重试此消息。或者让我们说在处理这封邮件时有一个例外。我想在延迟一段时间后重试处理此消息。我该如何做到这一点?

- 编辑 -
删除细节来减少问题的大小按阿尔乔姆的评论。

回答

0

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

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

即使您的变压器方法仅返回一个POJO,但这并不意味着它不会被包装到带有来自requestMessage头部的Message。如果你需要返回特定的头文件和你的POJO,你应该自己创建Message,使用MessageBuilder,并且不要忘记复制requestMessage头文件,只是因为如果整个消息被返回,变换器不会复制请求头文件。

您必须在您的JMS消费者上支持TX,以便RuntimeException将导致回滚并因此最终重新交付。你应该确保所有的流程都在同一个线程中执行。否则,TX被提交并且消息在代理上被查询。当你没有交易时也会发生同样的情况。

+0

我的服务激活器被定义为'public void fooHandler(Foo foo){...}'。因此,我想知道如何访问标题。我将它改为'public void fooHandler(Message message){...}'。现在有效负载具有'Foo'的实例,并且消息头可用。我没有意识到变压器返回的内容也包含在'Message'中。 我增加了更多的细节来解释我为什么在做我在做的事情。很多时候,人们会问我为什么选择一种特定的方式来做某件事。因此详细的长信息。 – shravanp

+0

好的。也许这只是晚上的效果:-)。我的答案有用吗?还是你需要其他的东西? –

+0

我正在尝试查找有关客户端的tx的spring文档。你能指点我正确的文件吗?我仍在搜索大量的春季集成参考。 – shravanp