搜索

179.14. 通过 JMS 的 request-reply

download PDF

Camel 支持通过 JMS 进行请求。当您向 JMS 队列发送消息时,交换的 MEP 应该为 InOut

Camel 提供了多个选项,用于通过 JMS 配置请求/回复,影响性能和集群环境。下表总结了选项。

选项性能集群描述

临时

速度快

临时队列用作回复队列,并由 Camel 自动创建。要使用它,不要指定 一个 replyTo 队列名称。您可选择配置 replyToType=Temporary,以代替该临时队列正在使用。

共享

slow

共享持久队列用作回复队列。必须事先创建队列,但有些代理可以立即创建它们,如 Apache ActiveMQ。要使用它,您必须指定 replyTo 队列名称。另外,您还可以配置 replyToType=Shared 来代替该共享队列正在使用。可以在集群环境中使用共享队列,同时运行此 Camel 应用程序的多个节点。所有都使用相同的共享回复队列。这是因为 JMS 消息选择器用于关联预期的回复消息;这影响了性能。JMS 消息选择器速度较慢,因此不像 临时 或排除队列一样快速。请参阅下面如何调整它以提高性能。

exclusive

速度快

否(*是)

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

concurrentConsumers

速度快

Camel 2.10. 3 :允许使用中的并发消息监听程序同时处理回复信息。您可以使用 concurrentConsumersmaxConcurrentConsumers 选项指定范围。注意: 使用共享 回复队列可能无法与并发监听器一起工作,因此请谨慎使用这个选项。

maxConcurrentConsumers

速度快

Camel 2.10. 3 :允许使用中的并发消息监听程序同时处理回复信息。您可以使用 concurrentConsumersmaxConcurrentConsumers 选项指定范围。注意: 使用共享 回复队列可能无法与并发监听器一起工作,因此请谨慎使用这个选项。

JmsProducer 检测到 InOut,并提供带有要使用的回复目的地的 JMSReplyTo 标头。默认情况下,Camel 使用临时队列,但您可以使用端点上的 replyTo 选项指定固定的回复队列(请参阅以下有关固定回复队列)。

Camel 将自动设置侦听回复队列的消费者,因此 您不应该 执行任何操作。
这个消费者是一个 Spring DefaultMessageListenerContainer,它侦听回复。但是,它被固定到 1 个并发消费者。
这意味着,将按顺序处理回复,因为只有 1 个线程来处理回复。如果您希望更快地处理回复,则需要使用并发。但不使用 concurrentConsumer 选项。我们应使用 Camel DSL 中的 线程,如下所示:

如果使用 Camel 2.10.3 或更高版本,则使用 concurrentConsumers 选项而不是使用线程。请参阅以下。

from(xxx)
.inOut().to("activemq:queue:foo")
.threads(5)
.to(yyy)
.to(zzz);

在此路由中,我们指示 Camel 使用具有 5 个线程的线程池异步路由回复。

现在,从 Camel 2.10.3 开始,您可以使用 concurrentConsumersmaxConcurrentConsumers 选项将监听程序配置为使用并发线程。这可让您在 Camel 中更轻松地配置它,如下所示:

from(xxx)
.inOut().to("activemq:queue:foo?concurrentConsumers=5")
.to(yyy)
.to(zzz);

179.14.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 millis 以每秒拉取 4 次,如下所示:

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&receiveTimeout=250")
.to(yyy)

请注意,这会导致 Camel 更频繁地向消息代理发送拉取请求,因此需要更多网络流量。
通常,建议您尽可能使用临时队列。

179.14.2. 通过 JMS 的 request-reply 并使用专用固定回复队列

从 Camel 2.9 开始可用

在上例中,Camel 会预期名为"bar"的固定回复队列已共享,因此它使用 JMSSelector 只消耗期望的回复消息。但是,这样做的一个缺陷是因为 JMS selectos 较慢。此外,回复队列上的使用者使用新的 JMS 选择器 ID 更新速度较慢。实际上,它只在 receiveTimeout 选项超时时才更新,默认为 1 秒。因此,在回复信息中,会花费大约 1 秒的时间被检测。另一方面,如果固定回复队列专用于 Camel 回复消费者,我们可以避免使用 JMS 选择器,因此更高性能。实际上,使用临时队列就快。因此,在 Camel 2.9 中,我们引入了 ReplyToType 选项,您可以将它配置为 Exclusive
,以告知 Camel 回复队列是独占的,如下例所示:

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)

请注意,队列必须专用于每个端点和每个端点。因此,如果您有两个路由,它们各自需要一个唯一的回复队列,如下例所示:

from(xxx)
.inOut().to("activemq:queue:foo?replyTo=bar&replyToType=Exclusive")
.to(yyy)

from(aaa)
.inOut().to("activemq:queue:order?replyTo=order.reply&replyToType=Exclusive")
.to(bbb)

如果您在集群环境中运行,也是如此。然后,集群中的每个节点都必须使用唯一的回复队列名称。否则,集群中的每个节点可能会选择信息,该消息旨在作为另一节点上的回复。在集群环境中,建议使用共享回复队列。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.