Apache Camel FTP - 上下文启动和停止之间的最佳实践是什么

时间:2012-12-13 11:10:18

标签: ftp apache-camel

我写了一些代码来从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方法。是否还可以花多少时间完成转移?

由于

2 个答案:

答案 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);
}

您可以使用类似的技术向负责使用诸如shutdownRouteshutdownRunningTask之类的DSL关闭事务的路由发送消息,或者某些processor退出app,优雅。

一旦有了这样的路由,就可以向应用程序发送调用此路由的相应消息并干净地退出(或者,使用Camel的 Main 类的实例并启用当您将 Ctrl + C 发送到正在运行的应用程序时,挂起支持会为您解决此问题。