如何在聚合器之后在链中定义异常路由器

时间:2017-09-05 07:24:40

标签: spring-integration

我使用Spring集成将消息聚合为一个然后通过FTP发送绑定适配器,我想在出站FTP服务器不可用时移动特定文件夹中的聚合消息(org.springframework.messaging.MessageDeliveryException),其他异常将通过控制台记录。

这是我的配置

<int:chain id="transformChain" input-channel="inboundChannel">
    <int:header-enricher>
        <int:header name="file_name" expression="payload.name"/>
        <int:header name="correlationId" expression="${header.enricher.correlationId}"/>
        <int:header name="sum" expression="${header.enricher.sum}"/>
    </int:header-enricher>

    <int:transformer ref="fileNameToContentTransformer"/>

    <int:aggregator send-partial-result-on-expiry="true"
                    release-strategy-expression="#this.size() == new Integer([0].headers.sum)"
                    group-timeout="${aggregator.group-timeout}"
                    message-store="messageStore"
                    expire-groups-upon-completion="true"
                    correlation-strategy-expression="headers.correlationId"/>
    <int:transformer ref="xmlToJsonTransformer"/>
    <ftp:outbound-channel-adapter remote-directory="${ftp.out.remote.directory}"
                                  session-factory="ftpOutClientSessionFactory" auto-create-directory="true"
                                  remote-filename-generator="fileNameGenerator" charset="UTF-8"
                                  temporary-file-suffix=".writing">
    </ftp:outbound-channel-adapter>

    <int:exception-type-router >
        <int:mapping exception-type="org.springframework.messaging.MessageDeliveryException" channel="undeliveredChannel"/>
        <int:mapping exception-type="java.lang.Exception" channel="myErrorChannel"/>
    </int:exception-type-router>
</int:chain>

但是在尝试开始时我遇到了这样的例外。

Caused by: java.lang.IllegalArgumentException: All handlers except for the last one in the chain must implement the MessageProducer interface. Object of class [org.springframework.integration.ftp.outbound.FtpMessageHandler] must be an instance of interface org.springframework.integration.core.MessageProducer
at org.springframework.util.Assert.instanceCheckFailed(Assert.java:389)
at org.springframework.util.Assert.isInstanceOf(Assert.java:327)
at org.springframework.integration.handler.MessageHandlerChain.configureChain(MessageHandlerChain.java:119)
at org.springframework.integration.handler.MessageHandlerChain.onInit(MessageHandlerChain.java:99)
at org.springframework.integration.context.IntegrationObjectSupport.afterPropertiesSet(IntegrationObjectSupport.java:176)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)

任何人都可以告诉我如何实现这一目标? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您无法在ftp:outbound-channel-adapter之后向链中添加组件,因为它不会产生任何结果。

有关如何通过向出站适配器添加ExpressionEvaluatingRequestHandlerAdvice来处理异常的示例,请参阅retry-and-more sample