我写了一些代码来从FTP站点下载文件,如下所示:
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
public void configure() {
from( uri ).to( localBox );
}
});
context.start();
// a tedious sleepy thread !?
// TODO: work around for a better solution
Thread.sleep(20000);
context.stop();
我正在寻找更好的解决方案,而不是Thread.sleep方法。是否还可以花多少时间完成转移?
由于
答案 0 :(得分:1)
通常,您将这些代码嵌入到某些实际上一直运行的应用程序中,例如Web应用程序,某些客户端gui应用程序,以及Apache SMX中的OSGi包或其他内容。
但是,如果这是您要运行的唯一代码(即批处理作业或类似代码),则有一种标准方法可以使用独立Camel执行您想要的操作。阅读this文章。
答案 1 :(得分:1)
以下语法将为您提供所需的功能,而无需使用 Thread.sleep :
context.getShutdownStrategy().setTimeout(20000);
此页面有一些other examples of ways to shutdown camel。但是,如果您使用这些方法,很可能您没有按预期使用骆驼。正如@Petter所说,Camel通常用于连续运行的服务器上。
在这里,当我们想要以“一次性”的方式运行路线时,我们通常只使用 Producer ,如下所示:
@Required
protected ProducerTemplate producer;
public Object getObjectFromRoute(String routeId, Object payloadBody) {
return producer.requestBody(routeId, payloadBody);
}
您可以使用类似的技术向负责使用诸如shutdownRoute
和shutdownRunningTask
之类的DSL关闭事务的路由发送消息,或者某些processor
退出app,优雅。
一旦有了这样的路由,就可以向应用程序发送调用此路由的相应消息并干净地退出(或者,使用Camel的 Main 类的实例并启用当您将 Ctrl + C 发送到正在运行的应用程序时,挂起支持会为您解决此问题。