我们使用 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将继续路由,而无需等待的响应>直接:callProcessor。
关于java - Apache Camel 中的 "Fire then Return"路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60001897/