如何以自动方式关闭独立的Apache Camel应用程序?

时间:2013-06-26 04:07:48

标签: java apache-camel

我正在尝试使用Apache Camel从FTP服务器下载和路由文件。但是,文件只会在很长一段时间内添加到FTP服务器,因此程序连续运行似乎有点过于热心。相反,我宁愿每周运行一个cronjob并处理已添加到服务器的任何新文件。

有没有办法让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>

3 个答案:

答案 0 :(得分:4)

请参阅此常见问题解答如何停止路线的路线:http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html

然后你可以启用选项:sendEmptyMessageWhenIdle = true,然后在路由中做一个消息过滤器或基于内容的路由,并检测空消息,然后停止路由然后在CamelContext之后。

虽然我也认为这个问题之前已经讨论过了,所以你可以找到其他SO问题或google等。因为还有另外的方法可以做到这一点。

答案 1 :(得分:3)

添加此示例,这可能对其他人有用而无需挖掘链接中的所有示例。

定义将启动单独线程的bean /处理器。这个新帖子会在有效stop()上调用CamelContext

public class ShutdownBean {

    private final static Logger log = LoggerFactory.getLogger(ShutdownBean.class);

    public void process(Exchange exchange) throws Exception {
        final CamelContext camelContext = exchange.getContext();

        Thread shutdownThread = new Thread(() -> {
            Thread.currentThread().setName("ShutdownThread");
            try {
                camelContext.stop();
            } catch (Exception e) {
                log.error("Errore during shutdown", e);
            }
        });

        shutdownThread.start();
    }
}

在您的应用程序上下文中定义此路由,并在需要关闭Camel时调用它。

<bean id="shutdownBean"
      class="your.package.ShutdownBean" />

<camelContext>

    <route id="ShutdownRoute">
        <from uri="direct:shutdown" />
        <log message="Shutdown..." />
        <to uri="bean:shutdownBean" />
    </route>

</camelContext>

注意:{@ 1}}在较新的Camel版本上已被弃用:默认情况下,现已启用,因此不再需要调用此方法。

答案 2 :(得分:0)

完成克劳斯的回答,此代码仅以一种老式的方式运行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秒后,该代码将仅运行一次,因为我们将调用一个处理器,该处理器将调用completed()方法,在内部使CountDownLatch停止另一个线程的路由模式。