java - 如何在 inOut 交换上 split() 之后一次仅发送 1 条消息

标签 java apache-camel

我使用 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/

相关文章:

java - Eclipse 中项目文件夹旁边的 "S"的含义

java - Bukkit/Spigot - EntityDamageByEntityEvent : cast the shooter

java.lang.NullPointerException : null at org. apache.camel.model.ModelHelper.getNamespaceAwareFromExpression(ModelHelper.java:263)

java - 我的比较器类不工作

java - ListView 仅显示 ListView 第一个位置的最后一项

java - 如何在 Camel quickfixj 组件中启用多线程

java - Apache Camel Spring Web 服务

java - 使用 Camel 在运行时配置数据源

activemq - 如何使用池正确配置 ActiveMQ?

java - @transactional 服务在 Spring 中应该是单例还是原型(prototype)?