272.7. Samples


要从绑定到路由密钥 B 的交换 A 的队列接收消息,

from("rabbitmq:A?routingKey=B")

要接收来自带有自动确认禁用的单一线程的队列的消息。

from("rabbitmq:A?routingKey=B&threadPoolSize=1&autoAck=false")

将消息发送到名为 C 的交换

to("rabbitmq:C")

声明标头交换和队列

from("rabbitmq:ex?exchangeType=headers&queue=q&bindingArgs=#bindArgs")

并将对应的 Map<String, Object > 替换为 Registry 中的 "bindArgs" 的 id。

例如,在 spring 中声明方法

@Bean(name="bindArgs")
public Map<String, Object> bindArgsBuilder() {
    return Collections.singletonMap("foo", "bar");
}

272.7.1. 在交换之间路由时出现问题(在 Camel 2.20.x 或更早版本中)

例如,如果要将信息从一个 Rabbit 交换路由到另一个,如下例所示,带有 foo bar :

from("rabbitmq:foo")
  .to("rabbitmq:bar")

然后请注意,Camel 会将消息路由到其自身,如 foo foo。那么为什么如此?这是因为接收消息的使用者(例如 from )提供消息标题 rabbitmq.EXCHANGE_NAME,其交换名称为 eg foo。当 Camel 生成者将消息发送到 bar 时,标头 rabbitmq.EXCHANGE_NAME 将覆盖此操作,而发送消息到 foo

要避免这种情况,您需要:

  • 删除标头:
from("rabbitmq:foo")
  .removeHeader("rabbitmq.EXCHANGE_NAME")
  .to("rabbitmq:bar")
  • 或者打开 producer 上的 bridgeEndpoint 模式:
from("rabbitmq:foo")
  .to("rabbitmq:bar?bridgeEndpoint=true")

从 Camel 2.21 开始有所改进,因此您可以在交换之间轻松路由。标头 rabbitmq.EXCHANGE_NAME 不再被生成者用来覆盖目标交换。相反,可以使用一个新的标头 rabbitmq.EXCHANGE_OVERRIDE_NAME 发送到不同的交换。例如,要发送到 cheese 交换,您可以这样做

from("rabbitmq:foo")
  .setHeader("rabbitmq.EXCHANGE_OVERRIDE_NAME", constant("cheese"))
  .to("rabbitmq:bar")
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.