2017-09-05 1 views
0

Lorsque j'utilise l'intégration Spring pour regrouper les messages en un seul puis envoyer par FTP un adaptateur lié, je souhaite déplacer les messages agrégés dans un dossier spécifique lorsque le serveur FTP sortant n'est pas disponible (org.springframework.messaging.MessageDeliveryException), d'autres exceptions seront enregistrées par la console.Comment définir un routeur d'exception dans la chaîne après agrégateur

Voici ma configuration

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

Cependant j'ai rencontré cette exception lorsque vous essayez de démarrer.

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) 

Quelqu'un peut me dire comment y parvenir? merci d'avance.

Répondre

1

Vous ne pouvez pas ajouter un composant à la chaîne après le ftp:outbound-channel-adapter car cela ne produit aucun résultat. Voir le retry-and-more sample pour un exemple de gestion des exceptions en ajoutant un ExpressionEvaluatingRequestHandlerAdvice à l'adaptateur sortant.