【问题标题】:Spring Integration: Exception Handling on Publish/Subscribe Channels with Ordered SubscribersSpring 集成:使用有序订阅者对发布/订阅频道进行异常处理
【发布时间】:2013-01-23 04:31:19
【问题描述】:

给定一个配置了任务执行器的发布-订阅通道,如果抛出异常,是否可以中断对其有序订阅者的调用?

例如,在此示例中,“工作”消息仍由序列中的第二个服务激活器发送。我希望这不会发生。

    <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上传失败,我不希望文件被删除,所以不能调用上游频道的第二个订阅者。

【问题讨论】:

    标签: java spring spring-integration enterprise-integration


    【解决方案1】:

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

    如果我正确理解您的用例,您应该能够使用新的 2.2 &lt;request-handler-advice-chain/&gt; 功能做您想做的事,您可以在其中添加 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>
    

    【讨论】:

    • 谢谢加里。对我的测试示例很有效,但遗憾的是 Amol 的 AWS 扩展还不支持 request-handler-advice-chain!
    • 我不熟悉适配器,但是,在命名空间支持通知链之前,您应该能够使用 来连接它——您只需要注入处理程序(并且建议链)到 ConsumerEndpointFactoryBean。
    • Gary,ExpressionEvaluatingRequestHandlerAdvice 没有将原始标头传递给 AdviceMessage 的构造函数是故意的吗?结果,我丢失了一个相关标头。
    • 标头在 AdviceMessage 的 inputMessage 属性上可用。您可以使用表达式“inputMessage.headers['foo']”添加标题丰富器。
    • 谢谢 - 你现在一定厌倦了回答我的愚蠢问题 :)
    猜你喜欢
    • 2019-10-04
    • 2014-05-30
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2017-05-05
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多