我的设置:
我有一个使用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) {...}
}
问题:
我想知道如何访问服务激活器中的邮件头。似乎服务激活器无法访问消息头,因为变换器正在返回pojo。
假设服务激活器因任何原因无法呼叫下游休息服务。我想现在跳过处理此消息,我想稍后重试此消息。或者假设处理此消息时有异常。我想在一段时间后重试处理此消息。我该如何做到这一点?
- edit--
根据Artem的评论删除了细节以减少问题大小。
答案 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被提交并且消息在代理上被激活。如果您没有交易,也会发生同样的情况。