当声明死信交换时,无法创建Camel RabbitMQ端点



我在使用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

最新更新