2013-02-07 61 views
0

给定一个配置有任务执行器的发布 - 订阅通道,如果抛出异常,是否有可能中断其订购订阅者的调用?弹簧整合:有序订阅者发布/订阅通道的异常处理

例如,在此示例中,'已处理'消息仍然由序列中的第二个服务激活器发送。我希望这不会发生。

<int:publish-subscribe-channel id="input" task-executor="taskExecutor" /> 

    <int:service-activator 
     input-channel="input" 
     order="1" 
     expression="1/0" 
     output-channel="nullChannel" 
    /> 
    <int:service-activator 
     input-channel="input" 
     order="2" 
     expression="'worked'" 
     output-channel="output" 
    /> 

    <int:channel id="output"> 
     <int:queue /> 
    </int:channel> 

现实世界中的用例是稍微复杂一些,在一个File发布到两个用户,一个用于解析它的内容,另一个用于归档到S3。应用了一个序列,以便可以在两个任务完成后进行汇总和删除。

S3上传通过一个没有回复的出站通道适配器来实现。因此,有一个发布 - 订阅频道首先调用S3适配器(使用order属性),然后将File发送到网桥,然后网桥将其放置在收集聚合消息的频道上。

如果S3上传失败,我不希望该文件被删除,所以不能调用上行通道的第二个用户。

回答

1

添加任务执行程序时,“order”属性确实没有意义,因为这两个任务都是异步执行的;打断“第二”线程可能为时已晚。要回答您的一般问题,不,一个线程上的故障不会中断其他线程。

如果我正确理解你的使用情况,你应该能够做到你想要使用的是什么2.2 <request-handler-advice-chain/>新的功能,在这里你可以添加一个ExpressionEvaluatingRequestHandlerAdvice采取不同的行动的基础上,成功或失败。这是在这个博客中讨论... http://blog.springsource.org/2012/10/09/spring-integration-2-2-retry-and-more/,特别是它参考的示例代码(对于ftp适配器)...

<int-ftp:outbound-channel-adapter 
    channel="inputChannel" 
    session-factory="mockSessionFactory" 
    remote-directory="foo"> 
    <int-ftp:request-handler-advice-chain> 
     <bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice"> 
      <property name="onSuccessExpression" value="payload.delete()" /> 
      <property name="successChannel" ref="afterSuccessDeleteChannel" /> 
      <property name="onFailureExpression" value="payload.renameTo(payload.absolutePath + '.failed.to.send')" /> 
      <property name="failureChannel" ref="afterFailRenameChannel" /> 
     </bean> 
    </int-ftp:request-handler-advice-chain> 
</int-ftp:outbound-channel-adapter> 
+0

谢谢加里。在我的测试示例中工作,但可悲的是Amol的AWS扩展不支持request-handler-advice-chain呢! –

+0

我对适配器并不熟悉,但是,除非命名空间支持建议链,否则您应该能够使用 s代替它 - 您只需将处理程序(和建议链)注入到ConsumerEndpointFactoryBean中即可。 –

+0

Gary,“ExpressionEvaluatingRequestHandlerAdvice”是不是将原始标头传递给'AdviceMessage'的构造函数?结果,我失去了一个相关标题。 –