我在使用Camel创建RabbitMQ端点时遇到问题。只有当我声明基于camel文档的死信交换选项时,才会出现此问题。这是我创建端点的URN:
rabbitmq://localhost/com.mydomain.inbound.exhange?deadLetterExchange=dead.msgs
当我省略deadLetterExchange选项时,一切都很好,但一旦我包括它,我就会得到以下(不是很有用)异常:
导致原因:java.lang.NullPointerException网址:com.rabbitmq.client.impl.ChannelN.validateQueueNameLength(ChannelN.java:1249)~[amqp-client 3.6.1.jar:?]网址:com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:843)~[amqp-client 3.6.1.jar:?]网址:com.rabbitmq.client.impl.ChannelN.queueDeclare(ChannelN.java:61)~[amqp-client 3.6.1.jar:?]网址:org.apache.cocamel.component.rabbitmq.RabbitMQDeclareSupport.declareAndBindQueue(RabbitMQDeclareSupport.java:96)~[camel-rabbitq-2.17.0.jar:2.17.0]访问org.apache.cocamel.component.rabbitmq.RabbitMQDeclareSupport.declareAndBindDeadLetterExchangeWithQueue(RabbitMQDeclareSupport.java:43)~[camel-rabbitq-2.17.0.jar:2.17.0]在org.apache.cocamel.component.rabbitmq.rabbitmq声明支持.declareAndBindExchangesAndQueuesUsing(rabbitmq声明支持.java:35)~[camel-rabbitq-2.17.0.jar:2.17.0]网址:org.apache.cocamel.component.rabbitmq.RabbitMQEndpoint.declareExchangeAndQueue(RabbitMQEndpoint.java:222)~[camel-rabbitq-2.17.0.jar网址:org.apache.cocamel.component.rabbitmq.RabbitConsumer.openChannel(RabbitConsumer.java:288)~[camel-rabbitq-2.17.0.jar网址:org.apache.cocamel.component.rabbitmq.RabbitConsumer.(RabbitConsumer.java:57)~[camel-rabbitq-2.17.0.jar访问org.apache.cocamel.component.rabbitmq.RabbitMQConsumer.createConsumer(RabbitMQConsumer.java:108)~[camel-rabbitq-2.17.0.jar网址:org.apache.cocamel.component.rabbitmq.RabbitMQConsumer.startConsumers(RabbitMQConsumer.java:90)~[camel-rabbitq-2.17.0.jar网址:org.apache.cocamel.component.rabbitmq.RabbitMQConsumer.doStart(RabbitMQConsumer.java:160)~[camel-rabbitq-2.17.0.jar网址:org.apache.cocamel.support.ServiceSupport.start(ServiceSupport.java:61)~[camel-core-2.17.0.jar:2.17.0]网址:org.apache.cocamel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3269)~[camel-core-2.17.0.jar:2.17.0]访问org.apache.cocamel.impl.DefaultCamelContext.doStartOrResumeRouteConsumers(DefaultCamelContext.java:3563)~[camel-core-2.17.0.jar:2.17.0]网址:org.apache.camel.impl.DefaultCamelContext.doStartRouteConsumers……
只是没有注意到,我也尝试过手动创建交换和队列,希望这可能会奏效,但运气不好。
附加信息:
- 骆驼弹簧靴启动器(2.17.0)
- 骆驼拉比q(2.17.0)
尝试添加deadLetterQueue
选项-
rabbitmq://localhost/com.mydomain.inbound.exhange?deadLetterExchange=dead.msgs&deadLetterQueue=my.dead.letter.queue
我还必须为uri添加更多的选项才能使其发挥作用。我添加了
- 死信交换类型
- queueArgsConfigurer
queueArgsConfigurer是org.apache.camel.component.rabbitmq.ArgsConfigurer
的实现
class MyQueueArgs implements ArgsConfigurer {
void configurArgs(Map<String, Object> args) { //misspelling!!
args.put("x-dead-letter-exchange", "my.dead.letter")
args.put("x-dead-letter-routing-key", "my.dead.letter.key")
}
}
我的是一个Spring应用程序,所以myArgs
(见下文)是在bean工厂中创建的。
所以,完整的uri是这样的-
rabbitmq://hostname/exchangeName?routingKey=$routingKey&vhost=virtualHostname&exchangeType=exType&autoDelete=false&queue=my.queue&deadLetterExchange=my.dead.letter&deadLetterExchangeType=dlExType&deadLetterQueue=my.dead.letter.queue&queueArgsConfigurer=#myArgs
我可能不需要在uri和ArgsConfigurer实现中指定死信交换。
关于ArgsConfigurer的更多信息,这个Camel问题可能会有所帮助-#8457
我必须查看源代码才能弄清楚这一点。文档中缺少依赖项的定义。有一些选择,特别是在死信交换方面,如果指定了另一个,则必须进行死信交换。这就是你犯错误的原因。查看RabbitMQDeclareSupport中的populateQueueArgumentsFromDeadLetterExchange
。
编辑
简化我的回答——我最终放弃了ArgsConfigurer
实现。我用了这个-
rabbitmq://myHostname/myExchangeName?
username=myUserName&
password=myPassword&
queue=myQueueName&
routingKey=myRoutingKey&
vhost=myVirtualHostname&
exchangeType=topic&
autoDelete=false&
deadLetterExchange=myDeadLetter&
deadLetterExchangeType=topic&
deadLetterQueue=myDeadLetterQueue&
deadLetterRoutingKey=myDeadLetterRoutingKey&
autoAck=false