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

tyg4sfes  于 2022-11-07  发布在  Apache
关注(0)|答案(4)|浏览(202)

我正在创建将文件从一个文件夹复制到另一个文件夹的基本路由。
我的最终目标是,在我的应用程序中有多个路由,并且每个路由都将作为批处理过程中的一个步骤被调用,一个接一个。因此,我必须为每个路由启动和停止camel上下文。
我写了下面代码
但 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/");
}
}

我也尝试过在route中使用oncompletion()选项,但那也没有帮助。
谢谢

yhxst69z

yhxst69z1#

Camel的MainSupport类可能正是您想要的。
如果您只希望复制一个文件,则也可以执行以下操作:
将CountDownLatch传递至HdfsRouteBuilder1的建构函式。然后在呼叫ctx.start之后,呼叫CountDownLatch上的wait。
在您的HdfsRouteBuilder1中,在闩锁完成后倒计时。
如果您希望有多个文件,则此方法将不起作用。

7cjasjjr

7cjasjjr3#

在启动上下文之后,您就显式地关闭了它。这使得它没有足够的时间来接收和处理事件。start方法不会阻塞(至少在camel 2中是这样)。
你需要在Camel启动后进行阻挡。为此,你有一些选择:

  • ctx.start();之后使用Thread.currentThread().join();进行阻止
  • 使用camel实用程序类阻止,请参见thiese javadocs
vddsk6oq

vddsk6oq4#

您可以在启动camel上下文后使用Thread.sleep(Time_in_milliseconds)。或者您可以使用camel main而不是DefaultCamelContext。

Main main = new Main();
main.configure().addRoutesBuilder(anotherRouteBuilder);
main.run();

相关问题