6

Apache Camel を使用して、FTP サーバーからファイルをダウンロードしてルーティングしようとしています。ただし、ファイルは長い間 1 回だけ FTP サーバーに追加されるため、プログラムを継続的に実行するのは少し熱心すぎるようです。代わりに、毎週実行され、サーバーに追加された新しいファイルを処理する cron ジョブが必要です。

処理する新しいファイルがなくなったら、Camel を自動的にシャットダウンする方法はありますか?

私の現在のmain機能は次のようになります。

public static void main (String[] args) throws Exception {
    org.apache.camel.spring.Main main = new org.apache.camel.spring.Main ();
    main.setApplicationContextUri ("applicationContext.xml");
    main.enableHangupSupport ();
    main.run (args);
}

の興味深い部分applicationContext.xmlは次のとおりです。

<camelContext>
    <route>
        <from uri="ftp://ftp.example.com/remoteDir?username=user&amp;password=pass"/>
        <to uri="file:../ftp_data?tempPrefix=."/>
    </route>
</camelContext>
4

3 に答える 3

4

ルートからルートを停止する方法については、この FAQ を参照してください: http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html

次に、オプション sendEmptyMessageWhenIdle=true を有効にしてから、ルートでメッセージ フィルターまたはコンテンツ ベースのルートを実行し、空のメッセージを検出して、ルートを停止し、その後で CamelContext を停止します。

この質問は以前に議論されたと思いますが、他のSOの質問やグーグルなどを見つけることができるかもしれません.これを行う別の方法もあります.

于 2013-06-29T06:52:27.753 に答える
2

クラウスの回答を完了すると、このコードは一度だけ実行されます Main:

import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;

public class MyMainRouter extends RouteBuilder {

  static Main main;

  @Override
  public void configure() throws Exception {
    from("timer:foo?delay=5s")
        .log("Hello camel, main world after 5 seconds!")
        .process(processor -> main.completed());
  }

  public static void main(String[] args) throws Exception {
    main = new Main();
    main.addRouteBuilder(new MyMainRouter());
    main.run();
  }

}

5 秒後、コードは 1 回だけ実行されます。これは、内部的に別のスレッドからのルート パターンを停止する CountDownLatch を持つ completed() メソッドを呼び出すプロセッサを呼び出すためです。

于 2018-07-16T13:09:25.357 に答える