Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring集成-异常和重试_Java_Spring Integration_Spring Retry - Fatal编程技术网

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"/>
问题:

  • 我想知道如何访问service activator中的消息头。服务激活器似乎没有访问消息头的权限,因为转换器正在返回pojo

  • 假设服务激活器由于任何原因无法调用下游rest服务。我想现在跳过处理此邮件,稍后重试此邮件。或者假设在处理此消息时出现异常。我想在延迟一段时间后重试处理此邮件。我如何做到这一点

  • --编辑--

    根据Artem的评论,删除了详细信息以减少问题量。

    请尝试在so中不要在此处设置太长的主题。如果其中有很多问题,很难回答特定的问题

    绝对不清楚为什么不能从ServiceActivator方法访问标头。您可以接受整个
    消息
    ,并调用其
    getHeaders()。您可以使用
    Map
    arg上的
    @Headers
    注释从消息中获取标题。您可以使用
    @Header`注释从消息中准确提取特定的头

    即使transformer方法只返回一个POJO,但这并不意味着它没有使用requestMessage的头将其包装到
    消息中。如果您需要与POJO一起返回特定的头,您应该使用
    MessageBuilder
    自己创建
    Message
    ,不要忘记复制requestMessage头,因为如果返回整个消息,transformer不会复制请求头


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

    请尝试在so中不要在此处设置太长的主题。如果其中有很多问题,很难回答特定的问题

    绝对不清楚为什么不能从ServiceActivator方法访问标头。您可以接受整个
    消息
    ,并调用其
    getHeaders()。您可以使用
    Map
    arg上的
    @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) {...}
    }