我使用 Camel 一段时间了,我非常欣赏它的简单性。
用例
考虑到这个简单的路线:
from("mock:some-route")
// split 1
.split().method("splitterBean", "split")
// now we have an ArrayList of n messages (let's say 10)
.to(ExchangePattern.InOut, "jms:some-thing");
如果我们假设 split() 之后有 10 条消息,则该路由将立即将 10 条消息发送到“to”端点。因此 jms:some-thing
将一次接收所有 10 条消息。
问题
--> 请注意,“out”端点是 inOut
,因此当接收者必须确认消息时,我们设置了超时。
jms:some-thing
接收端的应用程序必须为每条消息做相当多的工作。由于所有 10 条消息都是同时写入的,因此所有消息都适用相同的超时。
因此我们增加了超时时间。
但是有一天,我们将收到 1000 条消息,超时时间将再次变低。
我想要归档什么
我想实现一种模式,在分割后一次仅发送 1 条消息,然后在接收系统确认 1 条消息后发送下一条消息.
因此,我不想一次发送 10 条消息,而是想要
- 发送 1 条消息
- 等待该消息的确认
- 发送下一个
- 再等等
- 等等..
如何实现这样的行为?
我查看了文档,但似乎没有一个 EIP 组件能够满足该需求?
感谢您的任何意见
最佳答案
您可以拥有一个只有一个线程的中间 seda
队列。
from("mock:some-route")
.split().method("splitterBean", "split")
.to("seda:your-seda-queue?waitForTaskToComplete=Always&timeout=0");
from("seda:your-seda-queue?waitForTaskToComplete=Always&timeout=0")
.to(ExchangePattern.InOut, "jms:some-thing");
默认情况下,seda 队列将有一个消费线程,并将阻塞调用线程,直到消费者可用。 More on seda details here
也就是说,您发送到 jms 主题,这实际上是您应该用来对请求进行排队的方法,而不是使用 seda 队列。您应该考虑异步实现此逻辑,并等待回复主题而不是使用超时。
关于java - 如何在 inOut 交换上 split() 之后一次仅发送 1 条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45707458/