如何同步执行具有不同交换的骆驼路线?

时间:2018-11-06 21:32:03

标签: apache-camel synchronous

我有一些同步的骆驼路线:

from("file:...")
...
.to("direct:next1")

from("direct:next1")
...

现在,我想同步运行具有不同交换条件的另一条路线:

from("file:local/A")
...
.to("file:remote/A")
.to("direct:next2")

from("file:remote/A")  // direct:next2 ?
...

我该如何实现?

1 个答案:

答案 0 :(得分:2)

首先-房间里的大象。默认情况下,两条file路由都将启动和异步运行,因为在EIP级别上,这两条路由之间没有依赖性,可以告诉一条路由在另一条路由之后触发。

有两种解决方法(例如,强制路由之间相互依赖):

  • 要求local/A来启动remote/A路由(如果正在运行,请不要尝试重新启动该路由。
  • 允许remote/A以给定的时间间隔轮询文件。

通过链条开始路线是骆驼的一项更复杂的功能,它使您可以在闲暇时精确地定义路线的生命周期。在这种情况下,local/A文件路由使用完毕后,它将启动remote/A路由。

为此,我们可以利用Control Bus EIP来允许我们直接控制路由的生命周期。

from("file:local/A")
        .routeId("localA")
        .process(aProcessor)
        .to("controlbus:route?routeId=remoteA&action=start");

from("file:remote/A")
        .routeId("remoteA")
        .autoStartup(false)
        .process(aDifferentProcessor)
        .to("controlbus:route?routeId=remoteA&action=suspend&async=true");

投票可能是最直接的方法,不需要太多的挑剔。该文件要么存在,要么不存在,您可以选择等待特定时间段再次出现该文件。

from("file:local/A")
        .routeId("localA")
        .process(aProcessor);


from("file:remote/A?delay=2m")
        .routeId("remoteA")
        .process(aDifferentProcessor);
}

我的首选项是按固定的时间间隔或按cron计划进行轮询,这仅仅是因为感觉这两种方法都不会让您获得真正的同步性。您可以决定何时触发什么,但并不是direct路由那样100%同步。