我正在尝试使用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&password=pass"/>
<to uri="file:../ftp_data?tempPrefix=."/>
</route>
</camelContext>
答案 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停止另一个线程的路由模式。