Java Spring集成-异常和重试
我的设置:Java Spring集成-异常和重试,java,spring-integration,spring-retry,Java,Spring Integration,Spring Retry,我的设置: 我有一个使用ActiveMQ的消息守护进程,它将使用JSON消息。 JSON消息的发布者添加带有值的type头,例如,com.example.Foo,这是JSON消息的类型。我使用它将json转换为pojo 弹簧配置: 收到消息后,将执行以下步骤: 1.转换器:将json转换为pojo 2.有效负载类型路由器:根据pojo的类型,将pojo路由到适当的服务激活器。 3.服务激活器:处理消息 <int:chain input-channel="transformerChannel
我有一个使用ActiveMQ的消息守护进程,它将使用JSON消息。
JSON消息的发布者添加带有值的
type
头,例如,com.example.Foo
,这是JSON消息的类型。我使用它将json转换为pojo
弹簧配置:收到消息后,将执行以下步骤:
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"/>
问题:
根据Artem的评论,删除了详细信息以减少问题量。请尝试在so中不要在此处设置太长的主题。如果其中有很多问题,很难回答特定的问题 绝对不清楚为什么不能从ServiceActivator方法访问标头。您可以接受整个
消息
,并调用其getHeaders()。您可以使用
Maparg上的
@Headers注释从消息中获取标题。您可以使用
@Header`注释从消息中准确提取特定的头
即使transformer方法只返回一个POJO,但这并不意味着它没有使用requestMessage的头将其包装到消息中。如果您需要与POJO一起返回特定的头,您应该使用MessageBuilder
自己创建Message
,不要忘记复制requestMessage头,因为如果返回整个消息,transformer不会复制请求头
您必须在JMS使用者上支持TX,以便RuntimeException
将导致回滚,并最终重新交付。您应该确保所有流都在同一个线程中执行。否则,将提交TX并在代理上确认消息。当您没有事务时也会发生同样的情况。请尝试在so中不要在此处设置太长的主题。如果其中有很多问题,很难回答特定的问题
绝对不清楚为什么不能从ServiceActivator方法访问标头。您可以接受整个消息
,并调用其getHeaders()。您可以使用
Maparg上的
@Headers注释从消息中获取标题。您可以使用
@Header`注释从消息中准确提取特定的头
即使transformer方法只返回一个POJO,但这并不意味着它没有使用requestMessage的头将其包装到消息中。如果您需要与POJO一起返回特定的头,您应该使用MessageBuilder
自己创建Message
,不要忘记复制requestMessage头,因为如果返回整个消息,transformer不会复制请求头
您必须在JMS使用者上支持TX,以便RuntimeException
将导致回滚,并最终重新交付。您应该确保所有流都在同一个线程中执行。否则,将提交TX并在代理上确认消息。当您没有事务时也会发生同样的情况。My service activator被定义为public void foodhandler(Foo Foo){…}
。因此,我想知道如何访问标题。我将其更改为公共void foodhandler(Message Message){…}
。现在,有效负载有一个Foo
实例,并且消息头可用。我不知道transformer返回的内容也包含在消息中。我补充了更多的细节来解释我为什么要这么做。很多时候,人们问我为什么选择一种特殊的做事方式。这就是详细的长消息。也许这就是晚上的效果:-)。我的答案有用吗?或者您还需要其他什么吗?我正在尝试查找有关消费者端tx的spring文档。你能给我指一下正确的文件吗?我仍在搜索大量的spring集成参考资料。它完全基于My service activator,定义为public void foodhandler(Foo Foo){…}
。因此,我想知道如何访问标题。我将其更改为公共void foodhandler(Message Message){…}
。现在,有效负载有一个Foo
实例,并且消息头可用。我不知道transformer返回的内容也包含在消息中。我补充了更多的细节来解释我为什么要这么做。很多时候,人们问我为什么选择一种特殊的做事方式。这就是详细的长消息。也许这就是晚上的效果:-)。我的答案有用吗?或者您还需要其他什么吗?我正在尝试查找有关消费者端tx的spring文档。你能给我指一下正确的文件吗?我仍在搜索大量的spring集成参考资料。这完全是基于
public class FooHandler {
public void onMessage(Foo foo) {...}
}