3

我编写了一些代码来从 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 方法。是否也可以获得完成转移的剩余时间?

谢谢

4

2 回答 2

1

好吧,通常情况下,您会将这些代码嵌入到一些实际运行的应用程序中,例如 Web 应用程序、一些客户端 gui 应用程序、Apache SMX 内的 OSGi 包或其他类似的东西。

但是,如果这是您想要运行的唯一代码(即,用于批处理作业或类似工作),则有一种标准方法可以使用独立的 Camel 执行您想要的操作。阅读这篇文章。

于 2012-12-13T15:19:28.563 回答
1

主要答案

下面的语法将在不使用Thread.sleep的情况下为您提供所需的内容:

context.getShutdownStrategy().setTimeout(20000);

其他建议

此页面有一些其他关闭骆驼的方法示例。但是,如果您使用这些方法,则很可能您没有按预期使用骆驼。正如@Petter 所说,Camel 通常用于连续运行的服务器上。

在这里,当我们想以“一次性”的方式运行路由时,我们通常只使用Producer,如下所示:

@Required
protected ProducerTemplate producer;

public Object getObjectFromRoute(String routeId, Object payloadBody) {
    return producer.requestBody(routeId, payloadBody);
}

您可以使用类似的技术将消息发送到负责使用 DSL 关闭事物的路由,shutdownRoute以及shutdownRunningTask或某种processor优雅地退出应用程序的人。

一旦你有了这样的路由,你可以向你的应用程序发送适当的消息来调用这个路由并干净地退出(或者,使用 Camel 的Main类的实例并启用挂断支持Ctrl会在你发送+C到时为你处理这个问题您正在运行的应用程序)。

于 2012-12-14T21:47:38.230 回答