我们使用Apache Camel触发应用程序中的某些进程,例如:
from("quartz2://sometThing/someQueue?cron=0+0+4+?+*+MON-SUN").setBody(constant(""))
.routeId(this.getClass().getSimpleName())
.to("jms:some-trigger-queue");
然后,我们在触发队列之外有许多处理器来运行每个作业,例如:
from("jms:some-trigger-queue")
.processRef("someProcessor");
其中一些处理器将依次将消息写入JMS队列。我要解决的问题是,在整个过程完成之前,处理器不会将JMS消息提交给代理。我怀疑这是因为触发队列上有一条正在运行的消息(“ jms:some-trigger-queue”),并且由于处理器使用的上下文相同,直到清除了正在运行的消息,它们才会提交(仅供参考)想强迫在处理器中创建新交易,但没有成功)。
所以我的问题是,如果我只有一个处理器(或者我不在乎处理器是否同时运行)-我该如何配置 Camel 来触发处理器并立即继续运行(即从中删除触发消息)飞行)?
如果要呼叫处理器然后立即继续,则可以使用Wire Tap EIP(https://camel.apache.org/manual/latest/wireTap-eip.html)。
例如:
from("jms:some-trigger-queue")
.wireTap("direct:callProcessor");
from("direct:callProcessor")
.processRef("someProcessor");
这样,direct:callProcessor路由将在单独的线程上执行,并且jms:some-trigger-queue将继续路由,而无需等待direct:callProcessor的响应。