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

How to perform Camel routes with different exchanges synchronously?

我有一些同步的 Camel 路由:

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 ?
...

我怎样才能做到这一点?

首先 - 房间里的大象。默认情况下,您的 file 路由都将启动并且 运行 是异步的,因为在 EIP 级别上,这两个路由之间没有依赖关系来告诉一个路由在另一个路由之后触发。

有两种方法可以解决这个问题(例如强制路由之间相互依赖):

  • 要求 local/A 启动 remote/A 路线(并且如果 运行 正在 重新 启动路线。
  • 允许remote/A以给定的时间间隔轮询文件。

链式启动路由是 Camel 的一个更复杂的功能,它允许您在空闲时精确定义路由的生命周期。在这种情况下,在您的 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% 同步。