Java ApacheCamel-作业结束前关闭上下文

Java ApacheCamel-作业结束前关闭上下文,java,apache-camel,Java,Apache Camel,我正在创建将文件从一个文件夹复制到另一个文件夹的基本路径 我的最终目标是,如果我的应用程序中有多个路由,那么每个路由都将作为批处理过程中的一个步骤依次调用。因此,我必须为每条路线启动和停止骆驼上下文 我已经编写了以下代码 但是在完成工作之前就结束了 我不能让线程睡眠,因为我不知道这项工作需要多少时间 这方面的任何帮助都将是巨大的帮助 public class FileTransporter { public static void main(String[] args) { Hdf

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

我的最终目标是,如果我的应用程序中有多个路由,那么每个路由都将作为批处理过程中的一个步骤依次调用。因此,我必须为每条路线启动和停止骆驼上下文

我已经编写了以下代码

但是在完成工作之前就结束了

我不能让线程睡眠,因为我不知道这项工作需要多少时间

这方面的任何帮助都将是巨大的帮助

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/");
}
}
我还尝试在route中使用oncompletion()选项,但这也没有帮助


谢谢

您刚刚启动上下文,就显式关闭了上下文。这使得it没有足够的时间接收和处理事件。
start
方法不会阻塞(至少在camel 2中)

你需要在骆驼开始后拦截。为此,您有一些选择:

  • 使用
    Thread.currentThread().join()阻塞紧跟在
    ctx.start()之后
  • 使用camel实用程序类阻止,请参见

Camel的主要支持类可能就是您想要的

如果您只希望复制一个文件,那么以下操作也将起作用:

将倒计时闩锁传递给HdfsRouteBuilder1的构造函数。然后在您呼叫ctx.start后,在倒计时闩锁上呼叫wait

在HdfsRouteBuilder1中,完成后倒计时闩锁


如果您希望有多个文件,那么这将不起作用。

请参阅此有关独立运行Camel的常见问题解答:特别是此链接:

Thread.currentThread().join()将导致程序永不停止。您好,非常感谢您的回复。这解决了50%的问题。我在这里面临的问题是,如何在所有处理完成后手动停止上下文。在执行“main.run()”控件后,不会再次返回到main类。请参阅此常见问题解答:。您可以在文件端点上使用
sendEmptyMessageWhenIdle=true
来知道其为空,然后停止路由或驼峰本身,对于后者,请参见前面的问题,以便在没有更多文件/消息时如何停止驼峰。因此,在这里搜索或谷歌多一点。