Apache Camel - 在作业结束前关闭上下文

时间:2017-06-01 12:06:41

标签: java apache-camel

我正在创建一个将文件从一个文件夹复制到另一个文件夹的基本路径。

我的最终目标,如果我的应用程序中有多个路由,并且每个路由将作为批处理中的一个步骤一个接一个地调用。所以我必须为每条路线启动和停止驼峰上下文。

我写了以下代码。

但在完成工作之前,骆驼语境已经结束了。

我无法让线程睡眠,因为我不确定工作会花多少时间。

这方面的任何帮助都会有很大的帮助。

public class FileTransporter {


public static void main(String[] args) {

    HdfsRouteBuilder1 anotherRouteBuilder =new HdfsRouteBuilder1();

    CamelContext ctx = new DefaultCamelContext();

    try{
        ctx.addRoutes(anotherRouteBuilder);

        ctx.start();

        ctx.stop();
    } catch(Exception e){
        e.printStackTrace();
    }
}//end of main method
}

public class HdfsRouteBuilder1 extends RouteBuilder{

@Override
public void configure() throws Exception {

    from("file://E:/test/?noop=true")
    .threads(1)
    .to("file://E:/test1/");
}
}

我也试过在路线中使用oncompletion()选项,但这也没有帮助。

由于

3 个答案:

答案 0 :(得分:1)

Camel的MainSupport类可能就是您想要的。

如果您只希望复制一个文件,那么以下内容也适用:

将CountDownLatch传递给HdfsRouteBuilder1的构造函数。然后在调用ctx.start后调用CountDownLatch上的await。

在你的HdfsRouteBuilder1里面,在完成锁定后倒计时。

如果您希望有多个文件,那么这将无法正常工作。

答案 1 :(得分:0)

您在启动后立即关闭上下文。这并不足以让它有足够的时间来接收和处理事件。 start方法不会阻止(至少在骆驼2中)。

你需要在Camel启动后阻止。为此你有一些选择:

  • Thread.currentThread().join();
  • 之后使用ctx.start();屏蔽
  • 使用camel实用程序类阻止,请参阅thiese javadocs

答案 2 :(得分:0)

请参阅此常见问题解答,了解如何运行Camel独立版:http://camel.apache.org/running-camel-standalone.html,特别是此链接:http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html