首页 文章

Spring集成:使用有序订阅者发布/订阅 Channels 的异常处理

提问于
浏览
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 回答

  • 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>
    

相关问题