25.13. 与 JMS 相比请求


Camel 支持使用 JMS 进行请求。当您向 JMS 队列发送消息时,交换的 MEP 应是 InOut

Camel 提供了很多选项,可用于配置会影响性能和集群环境的 JMS。下表列出了相关的选项。

选项性能集群描述

临时

速度快

临时队列用作答复队列,并由 Camel 自动创建。要使用它,请不要 指定回复队列名称。您可以选择配置 replyToType=Temporary,使其代表临时队列处于使用状态。

共享

slow

共享持久队列用作回复队列。队列必须预先创建,但有些代理可以在 Apache ActiveMQ 等一样创建它们。要使用它,您必须指定 replyTo 队列名称。另外,您可以选择配置 replyToType=Shared,使其代表使用该共享队列。共享队列可在集群环境中使用,具有运行此 Camel 应用程序的多个节点。全部使用相同的共享回复队列。这是因为 JMS 消息选择器用于关联预期的回复信息,从而会影响性能。JMS 消息选择器较慢,因此不如 TemporaryExclusive 队列的速度。请参见下文中如何调整其性能以获得更好的性能。

专用

速度快

否(*是)

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

concurrentConsumers

速度快

允许使用 中的并发消息监听程序同时处理回复消息。您可以使用 并发Consumers 和 maxConcurrentConsumer s 选项指定范围。注意: 使用共享 回复队列可能并不能与并发监听器一起工作,因此要小心使用这个选项。

maxConcurrentConsumers

速度快

允许使用 中的并发消息监听程序同时处理回复消息。您可以使用 并发Consumers 和 maxConcurrentConsumer s 选项指定范围。注意: 使用共享 回复队列可能并不能与并发监听器一起工作,因此要小心使用这个选项。

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

Camel 将自动设置侦听回复队列的消费者,因此 不应 进行任何操作。
这个使用者是 Spring DefaultMessageListenerContainer,用于侦听回复。但它被修复为 1 个并发消费者。
这意味着,回复将按顺序进行处理,因为只有 1 个线程可以处理回复。您可以使用 concurrentConsumersmaxConcurrentConsumers 选项,将监听程序配置为使用并发线程。这可让您在 Camel 中更轻松地配置它,如下所示:

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

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

25.13.1. 依赖于 JMS 并使用共享的固定回复队列

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.