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
from("rabbitmq:foo") .to("rabbitmq:bar")
然后请注意,Camel 会将消息路由到其自身,如 foo 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")