2016-09-28 106 views
0

我正在使用Spring SFTP出站通道适配器上传SFTP服务器上的文件与重试机制。如果上传出现错误,我会发送电子邮件并在重试一定次数后将文件移动到错误文件夹中。春季集成:问题与故障ChannelChannel

下面是我的配置。

<file:inbound-channel-adapter id="csvFileChannel" 
    directory="${csv.base.directory}" filename-regex="^(.*).csv" 
    comparator="lastModifiedComparator" prevent-duplicates="true"> 
    <int:poller fixed-rate="5000" /> 
</file:inbound-channel-adapter> 

<bean id="lastModifiedComparator" 
    class="org.apache.commons.io.comparator.LastModifiedFileComparator" /> 
<bean id="sftpSessionFactory" 
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory" 
    lazy-init="true"> 
    <property name="host" value="${sftp.host}" /> 
    <property name="port" value="${sftp.port}" /> 
    <property name="user" value="${sftp.user}" /> 
    <property name="password" value="${sftp.password}" /> 
</bean> 

<int-sftp:outbound-channel-adapter 
    id="sftpOutboundAdapter" session-factory="sftpSessionFactory" channel="csvFileChannel" 
    remote-file-separator="/" remote-filename-generator-expression="payload.getName()" 
    remote-directory="/" mode="REPLACE"> 
    <int-sftp:request-handler-advice-chain> 
     <bean 
      class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice"> 
      <property name="onSuccessExpression" 
       value="payload.renameTo(new java.io.File('${csv.archive.directory}' , payload.name))" /> 
      <property name="successChannel" ref="nullChannel" /> 
      <property name="onFailureExpression" 
       value="payload.renameTo(new java.io.File('${csv.error.directory}' , payload.name))" /> 
      <property name="failureChannel" ref="failChannel" /> 
      <property name="trapException" value="true" /> 
     </bean> 
     <ref bean="retryAdvice" /> 
    </int-sftp:request-handler-advice-chain> 
</int-sftp:outbound-channel-adapter> 

<int:handler-retry-advice id="retryAdvice" 
    max-attempts="5"> 
    <int:fixed-back-off interval="5000" /> 
</int:handler-retry-advice> 

<int:channel id="failChannel" /> 

<int:chain input-channel="failChannel" output-channel="mailMessageChannel"> 
    <int:transformer 
     expression="'SFTP Upload failed for the file: ' + payload.failedMessage.payload.name " /> 
</int:chain> 
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="host" value="${smtp.host}" /> 
    <property name="port" value="${smtp.port}" /> 
    <property name="username" value="${smtp.userName}" /> 
    <property name="password" value="${smtp.password}" /> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.smtp.auth">true</prop> 
     </props> 
    </property> 
</bean> 

<int:channel id="mailMessageChannel" /> 
<int:chain input-channel="mailMessageChannel"> 
    <int-mail:header-enricher> 
     <int-mail:to value="${fail.email.to}" /> 
     <int-mail:cc value="${fail.email.to}" /> 
     <int-mail:from value="${fail.email.to}" /> 
     <int-mail:subject value="SFTP Upload failed" /> 
    </int-mail:header-enricher> 
    <int-mail:outbound-channel-adapter 
     mail-sender="mailSender" /> 
</int:chain> 

我面临的问题是,我收到每个文件2封电子邮件。无法找出问题。

这里是弹簧集成日志:spring-integration.logs

+0

请为'org.springframework.integration'分享'DEBUG'日志。没有'retryAdvice',你会收到多少电子邮件? –

+0

@ArtemBilan:为弹簧整合日志提供了链接。没有'retryAdvice'时试过2封邮件, – Vinod

回答

1

根据你的日志,我们从源代码目录两个文件:

2016-09-28 22:14:34,595 [DEBUG] [org.springframework.integration.file.FileReadingMessageSource] Added to queue: [D:\CSVFiles\MyCustomerTarget_20160928221429.csv, D:\CSVFiles\MyOrderTarget_20160928221429.csv] 

也许这会造成困惑,因为他们都与完成位相同的后缀?

这两个文件都无法传输到FTP,因此有两个关于错误的电子邮件。每个文件一个。

根据您的日志没有更多额外的电子邮件发送。

不,我为每个文件收到2封邮件。所以,总共有4封邮件,因为有2个文件。

好吧,让我们再看看你的配置一次!

<int-mail:to value="${fail.email.to}" /> 
<int-mail:cc value="${fail.email.to}" /> 

这不通过Gmail发送我的两个副本,但这并不意味着其他的邮件服务器不会将它像两封电子邮件向同一收件人。

+0

不,我为每个文件收到2封邮件。所以,总共有4封邮件,因为有2个文件。 – Vinod

+0

谢谢,这是问题所在。我为to和cc使用了相同的电子邮件ID。 – Vinod