我有一些同步的骆驼路线:
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 ?
...
我该如何实现?
答案 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%同步。