我的设置:
我有一个使用 ActiveMQ 的消息守护程序,它将使用 JSON 消息。
JSON消息的发布者添加type
带有值的标头,例如,com.example.Foo
这是json消息的类型。我用它来将 json 转换为 pojo。
Spring config:
收到消息后,将执行以下步骤:
1. Transformer:将 json 转换为 pojo
2. Payload type router:根据 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 的评论,删除了细节以减少问题的大小。