【问题标题】:Apache Camel - Context getting closed before job endsApache Camel - 在作业结束之前关闭上下文
【发布时间】:2017-06-01 12:06:40
【问题描述】:

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

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

我写了以下代码。

但是骆驼上下文在完成工作之前就结束了。

我不能让线程休眠,因为我不确定工作需要多长时间。

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

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() 选项,但这也无济于事。

谢谢

【问题讨论】:

    标签: java apache-camel


    【解决方案1】:

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

    如果您只希望复制一个文件,那么以下方法也可以:

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

    在您的 HdfsRouteBuilder1 中,完成后倒计时。

    如果您希望有多个文件,那么这是行不通的。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 您好,非常感谢您的回复。这解决了 50% 的问题。我在这里面临的问题是,如何在所有处理完成后手动停止上下文。在我执行 'main.run()' 之后,控制不再回到主类。
      • 查看此常见问题解答:camel.apache.org/how-can-i-stop-a-route-from-a-route.html。您可以使用文件端点上的sendEmptyMessageWhenIdle=true 来知道它何时为空,然后停止路由或骆驼本身,后者请参阅camel.apache.org/controlbus.html
      • 之前也有人问过这个问题,当没有更多文件/消息时如何停止 Camel。所以在这里搜索或谷歌多一点。
      【解决方案3】:

      您在启动上下文后就显式关闭它。这不允许它有足够的时间来接收和处理事件。 start 方法不会阻塞(至少在骆驼 2 中)。

      骆驼启动后你需要阻止。为此,您有一些选择:

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

      【讨论】:

      • Thread.currentThread().join() 将导致程序永不停止。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-09
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多