如何在使用Camel的spring-rabbitmq组件时自动声明exchange?

vfwfrxfs  于 2023-10-18  发布在  Apache
关注(0)|答案(1)|浏览(213)

我正在尝试从Camel 3.x迁移到Camel 4.x版本,所以我需要从rabbitmq组件迁移到替换的spring-rabbitmq组件。对于rabbitmq组件,我使用declare选项来让Camel自动创建和绑定队列和交换,现在我正在spring-rabbitmq组件中寻找等效的选项:
从文档中看,这是可能的:延期交易、排队和约束:
在您可以从RabbitMQ发送或接收消息之前,必须首先设置交换,队列和绑定。
在开发模式下,可能需要让Camel自动执行此操作。您可以通过在SpringRabbitMQComponent上设置autoDecliter =true来启用此功能。
然后Spring RabbitMQ将自动声明必要的元素,并设置交换,队列和路由键之间的绑定。
因此,我在application.properties中将camel.component.spring-rabbitmq.auto-declare属性配置为true,但这似乎只影响RabbitMQ消费者端点,而不是生产者。
使用这个简单的路由:

  1. <route id="receive-send-rabbitmq">
  2. <from uri="spring-rabbitmq:in-exchange?queues=queue-in"/>
  3. <log message="message received" />
  4. <to uri="spring-rabbitmq:out-exchange"/>
  5. </route>

Camel在启动路由时正确地自动声明了in-exchangequeue-in对象,并正确地接收了消息。但是由于交换机out-exchange不可用,发送部分失败。堆栈跟踪:

  1. 2023-07-10T11:54:12.094+02:00 DEBUG 3796 --- [pool-2-thread-5] o.s.amqp.rabbit.core.RabbitTemplate : Publishing message [(Body:'[B@149e60f3(byte[3])' MessageProperties [headers={}, contentType=application/octet-stream, contentLength=3, deliveryMode=PERSISTENT, priority=0, deliveryTag=0])] on exchange [out-exchange], routingKey = []
  2. 2023-07-10T11:54:12.099+02:00 INFO 3796 --- [ 127.0.0.1:5672] com.rabbitmq.client.impl.AMQConnection : Received a frame on an unknown channel, ignoring it
  3. 2023-07-10T11:54:12.099+02:00 DEBUG 3796 --- [pool-2-thread-5] o.s.amqp.rabbit.connection.RabbitUtils : Unexpected exception on closing RabbitMQ Channel
  4. com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'out-exchange' in vhost '/', class-id=60, method-id=40)
  5. at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
  6. at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
  7. at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502)
  8. at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
  9. at java.base/java.lang.Thread.run(Thread.java:833)
  10. Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange 'out-exchange' in vhost '/', class-id=60, method-id=40)
  11. at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:517)
  12. at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:341)
  13. at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
  14. at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
  15. at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:743)
  16. at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:47)
  17. at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:670)
  18. ... 1 common frames omitted

我知道我可以使用RabbitAdmin声明这些交换,但我不想在我的应用程序代码中手动处理这一点,路由作为专用文件夹中的XML文件交付,由应用程序在启动时动态加载。
使用Camel 4.0.0-rc 1和Sping Boot 3.1.1.

mfuanj7w

mfuanj7w1#

仅仅因为此组件选项仅适用于文档中明确说明的消费者端点,我引用如下:
指定consumer是否应该在启动时自动声明exchange、queue和routing key之间的绑定。启用这一点对开发很有好处,可以使代理上的交换、队列和绑定变得容易。
对于生产者端点,您需要通过将Queue声明为常规bean来手动创建它,Spring将自动为您创建队列。

  1. @Bean
  2. public Queue myDurableQueue() {
  3. // This queue has the following properties:
  4. // name: my_durable
  5. // durable: true
  6. // exclusive: false
  7. // auto_delete: false
  8. return new Queue("my_durable", true, false, false);
  9. }

请参阅this answer了解更多详细信息。

相关问题