2016-05-25 13 views
0

FTPからdownloadファイルへのユースケースがあり、ネットワーク再設定後にftpインバウンドアダプタが動作しなくなるという奇妙な動作があります。春の統合FTP InboundChannelAdapterがネットワークリセット後に終了する

ローカルへ
  1. 開始アプリケーション
  2. アプリケーションは、FTPサーバからファイルをダウンロードするために開始し
  3. 定義されたローカルディレクトリに表示されてfilename.writingファイルがあるネットワークのリセットをシミュレートするために、(ネットワークケーブルを抜きます状況)
  4. アプリケーションはファイルをダウンロードすることをやめます(ネットワーク接続はありません)。
  5. ネットワークケーブルを接続します。
  6. ダウンロードが再開またはリセットされないため、アプリケーションは依然として..続きます。
  7. この問題を特定するためには、まったくLOGはありません。

ありがとうございます!

UPDATE

この問題以下のコードは、FTP読み取りクライアント上WORKING例でタイムアウトdefSession.setConnectTimeout(Integer.valueOf(env.getProperty("ftp.timeout.connect")));

を追加することで固定してください。ここで

は、コードスニペットです:

@Bean 
    public DefaultFtpSessionFactory ftpSessionFactory() { 
     DefaultFtpSessionFactory defSession = new DefaultFtpSessionFactory(); 
     defSession.setUsername(env.getProperty("ftp.username")); 
     defSession.setPassword(env.getProperty("ftp.password")); 
     defSession.setPort(21); 
     defSession.setHost(env.getProperty("ftp.host")); 

     defSession.setClientMode(FTPClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE); 
     defSession.setControlEncoding("UTF-8"); 

     return defSession; 
    } 

    @Bean 
    PollableChannel ftpChannel() { 
     return new QueueChannel(Integer.valueOf(env.getProperty("ftp.channel.size"))); 
    } 

    @Bean 
    public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() { 
     FtpInboundFileSynchronizer ftpInboundFileSynchronizer = new FtpInboundFileSynchronizer(ftpSessionFactory()); 
     ftpInboundFileSynchronizer.setDeleteRemoteFiles(Boolean.valueOf(env.getProperty("ftp.directory.delete"))); 

     FtpRegexPatternFileListFilter ftpRegexPatternFileListFilter = new FtpRegexPatternFileListFilter(pattern); 
     ftpInboundFileSynchronizer.setFilter(ftpRegexPatternFileListFilter); 
     ftpInboundFileSynchronizer.setRemoteDirectory(env.getProperty("ftp.directory.remote")); 

     return ftpInboundFileSynchronizer; 
    } 

    @Bean 
    @InboundChannelAdapter(value = "ftpChannel") 
    public FtpInboundFileSynchronizingMessageSource ftpInboundFileSynchronizingMessageSource() { 
     FtpInboundFileSynchronizingMessageSource ftpInboundFileSynchronizingMessageSource = new FtpInboundFileSynchronizingMessageSource(ftpInboundFileSynchronizer()); 
     ftpInboundFileSynchronizingMessageSource.setLoggingEnabled(true); 
     ftpInboundFileSynchronizingMessageSource.setCountsEnabled(true); 
     ftpInboundFileSynchronizingMessageSource.setAutoCreateLocalDirectory(true); 
     ftpInboundFileSynchronizingMessageSource.setLocalDirectory(new File(env.getProperty("ftp.directory.local"))); 

     return ftpInboundFileSynchronizingMessageSource; 
    } 

    @Bean(name = PollerMetadata.DEFAULT_POLLER) 
    public PollerMetadata defaultPoller() { 
     PollerMetadata pollerMetadata = new PollerMetadata(); 
     pollerMetadata.setErrorHandler(t -> log.error("Failed to retrieve data from FTP: {}", t.getMessage(), t)); 
     pollerMetadata.setTrigger(new PeriodicTrigger(60, TimeUnit.SECONDS)); 
     return pollerMetadata; 
    } 

答えて

0

ほとんどのスレッドが読み取りにぶら下がっている - あなたは、コンピュータ上の実際のアダプタからケーブルを引く場合は、ネットワークスタックは、Javaプロセスに通知しなければなりませんソケットは消えていますが、ダウンストリームルータからケーブルを引き出すと、信号がない可能性があります。 jstackはスレッドが何をしているかを表示します。

セッションファクトリでタイムアウトを設定する必要があります。the documentationおよびFtpClient javadocsを参照してください。dataTimeoutが読み取りに使用されます。

+0

ありがとうございます!私たちのケースでは、ケーブルが下流から引き出されました。私はそれを試して、これが理由であるかどうかを知らせます。別の質問があります。なぜなら、 'spring-integration-ftp'モジュールにはほとんどログがありません。それ? – Jaiwo99

+0

私はあなたが何を意味するのかよくわかりません - もしスレッドが読み込み中に "つまらない"場合、何もログに記録できません。 DEBUGロギングを使用すると、正常に実行されているときにさらに多くのログを取得できます。 –

+0

私は 'logging.level.org.springframework.integration:TRACE'を設定しました。唯一のログは' 2016-05-25 16:32:11.677 DEBUG 24075 --- [ask-scheduler-5] osifsDefaultFtpSessionFactory:Connectedですサーバー[IP]に ' – Jaiwo99

関連する問題