2017-07-13 12 views
0

ファイルをsftpするためにリモートディレクトリをポーリングするポーラーがありますが、x回の試行後にファイルが見つからない場合は停止します。これは簡単な設定ですか?春の統合 - ファイルが返されない場合、ポーリングを停止します

ApplicationContext.xml 

     <int-sftp:inbound-channel-adapter id="sftpInboundAdaptor" 
              session-factory="sftpSessionFactory" 
              local-directory="${local.dir}" 
              auto-create-local-directory="true" 
              auto-startup="false" 
              channel="SftpChannel" 
              remote-directory="${remote.dir}" 
              filename-pattern="XXXX" 
              delete-remote-files="false" 
              charset="UTF-8" 
              remote-file-separator="/" 
              local-filename-generator-expression="#this"> 
      <int:poller max-messages-per-poll="1" fixed-rate="30000" > 
      </int:poller> 
     </int-sftp:inbound-channel-adapter> 



Main.class 

    private static void sftpFile(String party) throws Exception { 
      SourcePollingChannelAdapter adapter = (SourcePollingChannelAdapter) applicationContext.getBean("sftpInboundAdaptor"); 
      adapter.start(); 
      SftpDownloader sftpProcessor = (SftpDownloader) applicationContext.getBean("sftpDownloader"); 
      LOGGER.info((fileDownloaded ? "Successful" : "Failed") + " downloading file""); 
     } 




SftpDownloader.class 

    public boolean receiveFile(String party, String fileType) throws SftpJobException { 
      if (Constants.1.equals(fileType)) { 
       return isFile1SftpSuccessful(); 
      } else if (Constants.2.equals(fileType)) { 
       return isFile2SftpSuccessful(party); 
      } 
      return false; 
     } 

     private boolean isFile1SftpSuccessful() throws SftpJobException { 
      return isValidFile((File) SftpChannel.receive().getPayload()); 
     } 
      private boolean isValidFile(File received) throws SftpJobException{ 
      if (received.length() != 0) { 
       LOGGER.info("File is: {}", received.toString()); 
       return true; 
      } else { 
       throw new SftpJobException("File size is 0, either no file exists an empty file was created. ") 
      } 
     } 

私は、ファイルが存在しなかった場合は例外をスローしたいのに対し、私は上記のファイル(存在しない)を探したとき、私は無期限にそれをポーリングのように思えます。

+0

私はこれをExecutorでタイムアウトで実行します。あるいは、ポーリングをやめて、反応するSpringやイベントについて考えるのが良いでしょう。 – duffymo

答えて

0

Smart Pollingを参照してください。メッセージの不足を検出してポーラーを停止できます。

バージョン4.2では、AbstractMessageSourceAdviceが導入されました。このクラスをサブクラス化するアドバイスチェーン内のAdviceオブジェクトは、受信操作だけに適用されます。このようなクラスには、次のメソッドを実装します。

beforeReceive(MessageSource<?> source)

このメソッドはMessageSource.receive()メソッドの前に呼び出されます。この時点で、ソースを調べたり、再構成したりすることができます。 falseを返すと、この投票はキャンセルされます(上記のPollSkipAdviceに似ています)。

Message<?> afterReceive(Message<?> result, MessageSource<?> source)

この方法は、受信()メソッドの後に呼び出されます。再度、ソースを再構成したり、結果に応じて何らかのアクションをとることができます(ソースによって作成されたメッセージがない場合はnullになる可能性があります)。別のメッセージを返すことさえできます!

+0

残念ながら私は4.1を使用しています。アップグレードすることはできません:( – Stefan101

+0

あなた自身の 'Advice'実装にソリューションをコピー/ペーストするオプションしかありません:https://github.com/spring-projects/spring-integration /blob/master/spring-integration-core/src/main/java/org/springframework/integration/aop/AbstractMessageSourceAdvice.java –

+0

これはうまくいかず、 'SourcePollingChannelAdapter'にも対応する変更が必要です。これは' receive() 'メソッドを呼び出し、ポーリングの前後にこれらのメソッドを呼び出すことができます。チャネルにチャネルインターセプタを追加してタイマーを開始することができ、一定期間後にチャネルにメッセージが送信されない場合は、アダプタを停止します。 –

関連する問題