gpt4 book ai didi

java - Spring Integration - 异常和重试

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:36 25 4
gpt4 key购买 nike

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

Spring 配置:
收到消息后,将执行以下步骤:
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) {...}
}

问题:

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

  2. 假设服务激活器由于某种原因无法调用下游休息服务。我现在想跳过处理此消息,并想稍后重试此消息。或者假设处理此消息时出现异常。我想在延迟一段时间后重试处理此消息。我该如何实现这一目标?

--编辑--
根据 Artem 的评论,删除了详细信息以减少问题大小。

最佳答案

请尽量不要在这里提出这么长的主题。如果有很多问题,就很难回答特定的问题。

完全不清楚为什么您无法从服务激活器方法访问 header 。全部可以接受Message<> ,并将其称为 getHeaders(). You can use @标题annotation on the map arg to get headers from the message. You can use @Header` 注释用于从消息中提取特定的 header 。

即使您的转换器方法仅返回 POJO,也不意味着它没有包装到 Message带有 requestMessage 的 header 。如果您需要与 POJO 一起返回特定 header ,您应该创建 Message你自己,使用 MessageBuilder并且不要忘记复制 requestMessage header ,因为如果返回整个消息,转换器不会复制请求 header 。

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

关于java - Spring Integration - 异常和重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44835197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com