2

我一直在尝试使用 2.12.1-SNAPSHOT 中的 RabbitMQComponent 版本让骆驼路由。这样做,我已经能够轻松消费,但在路由到另一个队列时会遇到广告问题。

CamelContext 上下文 = 新的 DefaultCamelContext();

context.addComponent("rabbit-mq", factoryComponent());

from("rabbit-mq://localhost/test.exchange&queue=test.queue&username=guest&password=guest&autoDelete=false&durable=true")
.log("${in.body}")
.to("rabbit-mq://localhost/out.queue&routingKey=out.queue&durable=true&autoAck=false&autoDelete=false&username=guest&password=guest")
。结尾();

在此,我已经验证了指定的交换是否配置了适当的路由密钥。我注意到我可以大量消费,但不能生产到 out.queue。

以下是对处理消息的 RabbitMQProducer 的唯一引用。

09:10:28,119 DEBUG RabbitMQProducer[main]: - 开始生产者:Producer[rabbit-mq://localhost/out.queue?autoAck=false&autoDelete=false&durable=true&password=xxxxxx&routingKey=out.queue&username=guest]
09:10:48,238 DEBUG RabbitMQProducer[Camel (camel-1) thread #11 - ShutdownTask]: - 停止生产者:Producer[rabbit-mq://localhost/out.queue?autoAck=false&autoDelete=false&durable=true&password=xxxxxx&routingKey=out .queue&username=guest]

我花了一些时间研究 RabbitMQ 组件的 Camel 单元测试,但我没有看到任何非常有价值的用途。有没有人能让这个工作?

谢谢。

4

3 回答 3

0

根据http://camel.apache.org/rabbitmq.html端口是可选的。

最好的

于 2014-12-11T10:10:11.060 回答
0

我用spring dsl做到了。这是我使用的网址。java dsl 中不需要端口号吗?

rabbitmq://localhost:5672/subscribeExchange?queue=subscribeQueue&durable=true&username=guest&password=guest&routingKey=subscribe

于 2013-09-17T08:21:08.680 回答
0

我遇到了同样的问题,即使我在提出原始问题 5 年后尝试。但是在这里发布我是如何让它工作的,以防其他人面临同样的问题。

问题是,即使我们将“routingKey”添加到 URI,rabbitmq 路由密钥也不会改变。诀窍是在发送之前添加一个标题。如果您记录消息接收和正在发送的消息,我们可以清楚地看到路由键是相同的。

下面是我的代码。它将从“receiveQueue”读取消息并发送到“sendQueue”

@Value("${rabbit.mq.host}")
private String host;

@Value("${rabbit.mq.port}")
private int port;

@Value("${rabbit.mq.exchange}")
private String exchange;

@Value("${rabbit.mq.receive.queue}")
private String receiveQueue;

@Value("${rabbit.mq.send.queue}")
private String sendQueue;


public void configure() throws Exception {
    String uriPattern = "rabbitmq://{0}:{1}/{2}?queue={3}&declare=false";
    String fromUri = MessageFormat.format(uriPattern, host, port, exchange, receiveQueue);
    String toUri = MessageFormat.format(uriPattern, host, port, exchange, sendQueue);

    from(fromUri).to("log:Incoming?showAll=true&multiline=true").
            unmarshal().json(JsonLibrary.Gson, Message.class).bean(MessageReceiver.class).to("direct:out");

    from("direct:out").marshal().json(JsonLibrary.Gson).setHeader("rabbitmq.ROUTING_KEY",
            constant(sendQueue)).to(toUri);

}
于 2018-04-29T14:30:12.373 回答