我正在尝试从 Camel 3.x 迁移到 Camel 4.x 版本,因此我需要从rabbitmq
替换组件spring-rabbitmq
. With rabbitmq
我正在使用的组件declare https://camel.apache.org/components/3.20.x/rabbitmq-component.html#_component_option_declare让 Camel 自动创建和绑定队列和交换器的选项,现在我正在寻找等效的选项spring-rabbitmq
成分:
从文档来看,这是可能的:自动声明交换、队列和绑定 https://camel.apache.org/components/3.20.x/spring-rabbitmq-component.html#_auto_declare_exchanges_queues_and_bindings:
在您可以从 RabbitMQ 发送或接收消息,然后进行交换之前,
必须首先设置队列和绑定。
在开发模式下,可能需要让 Camel 自动执行
这。您可以通过设置 autoDeclare=true 来启用此功能
SpringRabbitMQ组件。
然后 Spring RabbitMQ 将自动声明必要的元素并
设置交换键、队列键和路由键之间的绑定。
所以我配置了camel.component.spring-rabbitmq.auto-declare
财产给true
in my application.properties
,但这似乎只影响 RabbitMQ 消费者端点,而不影响生产者。
使用这个简单的路线:
<route id="receive-send-rabbitmq">
<from uri="spring-rabbitmq:in-exchange?queues=queue-in"/>
<log message="message received" />
<to uri="spring-rabbitmq:out-exchange"/>
</route>
The in-exchange
and queue-in
当启动路由时,Camel 会正确自动声明对象,并正确接收消息。但发送部分由于交换而失败out-exchange
无法使用。堆栈跟踪 :
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 = []
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
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
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)
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:66)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:36)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:502)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
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)
at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:517)
at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:341)
at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:743)
at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:47)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:670)
... 1 common frames omitted
我知道我可以使用以下方式声明这些交换RabbitAdmin
但我不想在我的应用程序代码中手动处理这个问题,路由作为专用文件夹中的 XML 文件提供,由应用程序在启动时动态加载。
将 Camel 4.0.0-rc1 与 Spring Boot 3.1.1 结合使用。