177.12. 对 JMS 的请求

Camel 支持通过 JMS 重新请求。在向 JMS 队列发送消息时,交换的 MEP 应处于 out Out 状态。

Camel 提供多种选项来配置请求/相对于 JMS,这会影响性能和集群环境。下表总结了 选项。

选项性能集群描述

临时

速度快

临时队列用作回复队列,并由 Camel 自动创建。要使用此目的,不要指定 一个 replyTo 队列名称。您可以选择性地配置 replyToType=Temporary,使其使用默认的临时队列。

共享

速度较慢

共享持久队列用作回复队列。队列必须预先创建,虽然有些代理可以在 Apache ActiveMQ 等时创建它们。要使用此目的,您必须指定 replyTo 队列名称。您可以选择配置 replyToType=Shared,使其代表使用共享队列。在具有多个同时运行此 Camel 应用程序的节点的集群环境中,可以使用共享队列。所有都使用相同的共享回复队列。这是因为 JMS 消息选择器用于关联预期的回复消息;这会影响性能。JMS 消息选择器的速度较慢,因此随着 TemporaryExclusive 队列而快速。查看如何调整它以提高性能。

独占

速度快

否(*是)

独占持久队列被用作回复队列。队列必须预先创建,虽然有些代理可以在 Apache ActiveMQ 等时创建它们。要使用此目的,您必须指定 replyTo 队列名称。您还必须配置 replyTo Type=Exclusive,以指示 Camel 使用独占队列,因为如果配置了回复队列名称,则默认使用 Shared。使用专用回复队列时,JMS 消息选择器不使用,因此其他应用不得使用该队列。在同时运行此 Camel 应用程序的多个节点的集群环境中 无法使用 独占队列;因为我们没有控制该回复队列回发送请求消息的同一节点;这就是为什么共享队列使用 JMS 消息选择器来确保这一点。虽然 如果您配置了每个节点的唯一名称,但您可以在集群环境中运行这个队列。然后,回复消息将发回给定节点的该队列,该队列等待回复消息。

concurrentConsumers

速度快

Camel 2.10.3: 允许使用并发消息监听程序来同时处理消息。您可以使用 并发Consumers 和 maxConcurrentConsumer s 选项指定一个范围。注意: 使用共享 回复队列可能不适用于并发监听器,因此请小心使用这个选项。

maxConcurrentConsumers

速度快

Camel 2.10.3: 允许使用并发消息监听程序来同时处理消息。您可以使用 并发Consumers 和 maxConcurrentConsumer s 选项指定一个范围。注意: 使用共享 回复队列可能不适用于并发监听器,因此请小心使用这个选项。

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 和 maxConcurrentConsumers 选项将侦听器配置为使用并发 线程。这可让您在 Camel 中更轻松地配置它,如下所示:

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 将拉取请求更频繁地发送到消息代理,因此需要更多的网络流量。
通常建议尽可能使用临时队列。