31.13. 通过 JMS 请求代表
Camel 支持通过 JMS 重新请求请求。在向 JMS 队列发送消息时,交换的 MEP 应该为 InOut
。
Camel 提供了多个选项来配置请求/对 JMS 的影响,它们会影响性能和集群环境。下表总结了选项。
选项 | 性能 | 集群 | 描述 |
---|---|---|---|
| 速度快 | 是 |
临时队列用作回复队列,并由 Camel 自动创建。要使用它,不要指定 replyTo 队列名称。另外,您还可以配置 |
| slow | 是 |
共享持久性队列用作回复队列。必须事先创建队列,但有些代理可以在实时(如 Apache ActiveMQ)上创建它们。要使用此功能,您必须指定 replyTo 队列名称。另外,您还可以配置 |
| 速度快 | 否(是) |
专用持久队列用作回复队列。必须事先创建队列,但有些代理可以在实时(如 Apache ActiveMQ)上创建它们。要使用此功能,您必须指定 replyTo 队列名称。必须配置 |
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
| 速度快 | 是 |
允许使用并发消息监听程序同时处理回复消息。您可以使用 |
JmsProducer
检测到 InOut
,并提供带有要使用的回复目的地的 JMSReplyTo
标头。默认情况下,Camel 使用临时队列,但您可以使用端点上的 replyTo
选项指定固定的回复队列(请参阅以下有关固定回复队列的更多信息)。
Camel 将自动设置侦听回复队列的消费者,因此 您不应该 执行任何操作。
此消费者是一个 Spring DefaultMessageListenerContainer
,它侦听回复。但是,它被固定到 1 个并发消费者。
这意味着回复将按顺序处理,因为只有 1 个线程来处理回复。您可以使用 concurrentConsumers
和 maxConcurrentConsumers
选项将监听程序配置为使用并发线程。这可让您更轻松地在 Camel 中配置此功能,如下所示:
from(xxx) .inOut().to("activemq:queue:foo?concurrentConsumers=5") .to(yyy) .to(zzz);
在这个路由中,我们指示 Camel 使用具有 5 个线程的线程池异步路由回复。
31.13.2. 请求通过 JMS,并使用一个专用固定回复队列
在上例中,Camel 将预期名为"bar"的固定回复队列被共享,因此它使用 JMSSelector
来仅消耗期望的回复消息。但是,这个问题有缺陷,因为 JMS 选择器会较慢。另外,回复队列上的消费者使用新的 JMS 选择器 ID 更新速度较慢。实际上,只有在 receiveTimeout
选项超时时才会更新,默认为 1 秒。因此,在回复消息中,可能会检测到大约 1 秒。另一方面,如果固定回复队列专用于 Camel 回复消费者,则我们可以避免使用 JMS 选择器,因此更为高性能。实际上,使用临时队列就快。您可以将 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)
如果您在集群环境中运行,则适用相同。然后,集群中的每个节点都必须使用唯一的回复队列名称。否则,集群中的每个节点可能会获取旨在作为另一节点上的回复的信息。对于集群环境,建议您使用共享回复队列。