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

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

有没有办法让Camel在不再有任何新文件要处理后自动关闭?

我目前的mainfunction如下:

 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的有趣部分是:

       

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

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

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

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

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

 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时调用它。

         

注意 :对于较新的Camel版本,不推荐使用enableHangupSupport()现在默认启用,因此不再需要调用此方法。

完成克劳斯答案,这段代码只用一次方式运行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从另一个线程停止一个路由模式。