4

我想运行一个简单的Apache Camel示例,将文件从一个目录复制到另一个目录:

CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {

  public void configure () throws Exception {
    from("file://c:/fromdir/").to("file://c:/todir/");
  } 
});
context.start();

如果我使用 Apache Camel 2.0.0 运行此示例,程序会立即退出context.start();并且什么也不做。如果我Thread.sleep(30000);在启动后添加CamelContext,后台线程会完成它们的工作,并且文件会从源目录复制到目标目录 30 秒。

但是,如果我使用 Apache Camel 1.6.2 运行相同的代码,该start()方法会自动阻塞,我不需要让主线程进入睡眠状态来复制文件。我没有发现这种行为从 Camel 1.x 更改为 2.x 的提示。这真的是预期的行为吗?是否可以让 start() 方法阻止 Camel 2.0.0 中的执行?

谢谢

4

2 回答 2

10

或者您可以添加

Thread.currentThread().join();

在 context.start() 之后;

于 2010-03-10T12:16:51.213 回答
8

是的,在骆驼上下文中调用 start() 永远不应该阻塞线程。而骆驼2.0的这种正确行为。

您可以使用 org.apache.camel.util 中的 MainSupport 类作为起点来阻止,直到您按 ctrl + c 或在 CamelContext 上调用 stop()。

例如,请参见骆驼弹簧中的 Main,它扩展了 MainSupport,并且能够从 Spring XML 文件加载 Camel。

于 2009-12-04T16:09:43.897 回答