177.12. 对 JMS 的请求
Camel 支持通过 JMS 重新请求。在向 JMS 队列发送消息时,交换的 MEP 应处于 out Out
状态。
Camel 提供多种选项来配置请求/相对于 JMS,这会影响性能和集群环境。下表总结了 选项。
选项 | 性能 | 集群 | 描述 |
---|---|---|---|
| 速度快 | 是 |
临时队列用作回复队列,并由 Camel 自动创建。要使用此目的,不要指定 一个 replyTo 队列名称。您可以选择性地配置 |
| 速度较慢 | 是 |
共享持久队列用作回复队列。队列必须预先创建,虽然有些代理可以在 Apache ActiveMQ 等时创建它们。要使用此目的,您必须指定 replyTo 队列名称。您可以选择配置 |
| 速度快 | 否(*是) |
独占持久队列被用作回复队列。队列必须预先创建,虽然有些代理可以在 Apache ActiveMQ 等时创建它们。要使用此目的,您必须指定 replyTo 队列名称。您还必须配置 |
| 速度快 | 是 |
Camel 2.10.3: 允许使用并发消息监听程序来同时处理消息。您可以使用 |
| 速度快 | 是 |
Camel 2.10.3: 允许使用并发消息监听程序来同时处理消息。您可以使用 |
JmsProducer
检测了 InOut
,并提供要使用的回复目的地的 JMSReplyTo
标头。默认情况下,Camel 使用临时队列,但您可以使用端点上的 replyTo
选项指定固定的回复队列(请参阅以下关于固定回复队列的更多信息)。
Camel 将自动设置侦听回复队列的使用者,因此 您不应 进行任何操作。
此使用者是一个 Spring DefaultMessageListenerContainer
,用于侦听回复。但是,它被修复为 1 个并发使用者。
这意味着回复将按顺序处理,因为只有 1 个线程处理回复。如果您想要更快地处理回复,那么我们需要使用并发。但不使用 并发Consumer
选项。我们应该使用 Camel DSL 中的 线程
,如以下路由所示:
如果使用 Camel 2.10.3 或者更好的,而不是使用线程,然后使用并发Consumers 选项。请参见下文。
from(xxx) .inOut().to("activemq:queue:foo") .threads(5) .to(yyy) .to(zzz);
在该路由中,我们指示 Camel 使用具有 5 个线程的线程池异步路由回复。
从 Camel 2.10.3 开始,您可以使用并发 Consumers 和
线程。这可让您在 Camel 中更轻松地配置它,如下所示:
maxConcurrentConsumers
选项将侦听器配置为使用并发
from(xxx) .inOut().to("activemq:queue:foo?concurrentConsumers=5") .to(yyy) .to(zzz);
177.12.1. 请求 - 在 JMS 上,使用共享的固定回复队列
如果您在执行 Request Reply over JMS 时使用固定回复队列,如以下示例所示,请留意。
from(xxx) .inOut().to("activemq:queue:foo?replyTo=bar") .to(yyy)
在这个示例中,使用名为 "bar" 的固定回复队列。默认情况下,Camel 假定在使用固定回复队列时共享队列,因此它使用 JMSSelector
来仅提取预期的回复消息(例如,基于 JMSCorrelationID
)。请参见下一节,了解独占固定的回复队列。这意味着它不像临时队列一样快。您可以使用 receiveTimeout
选项加快 Camel 将拉取的回复消息的频率。默认情况下,其 1000 millis。因此,更快地将其设置为 250 次,以每秒拉取 4 次,如下所示:
from(xxx) .inOut().to("activemq:queue:foo?replyTo=bar&receiveTimeout=250") .to(yyy)
请注意,这将导致 Camel 将拉取请求更频繁地发送到消息代理,因此需要更多的网络流量。
通常建议尽可能使用临时队列。