【发布时间】:2025-07-23 15:10:02
【问题描述】:
我在骆驼中设置了一个简单的泵,它使用以下 uri 从供应商的 rabbitmq 服务器消耗:
rabbitmq://host:port/statusExchange?queue=myQueueName&username=un&password=pass&exchangeType=fanout&autoDelete=true&durable=false
(他们的交换设置为 autodelete=true,durable=false)
当它运行时,它会创建一个新队列 (myQueueName),它也是 autodelete=true Durable=false。
我希望我的队列为 autodelete=false,因为我们在供应商系统和我的系统之间存在一些网络不稳定。
但是,如果我更改 uri 中的自动删除参数,我会在运行代码时遇到错误,归结为:
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for exchange 'statusExchange' in vhost '/': received 'false' but current is 'true', class-id=40, method-id=10)
如果我进入管理工具并手动创建队列,请将自动删除设置为 false。然后在 uri 中设置 autoDelete=true 我得到以下错误:
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'auto_delete' for queue 'myQueueName' in vhost '/': received 'true' but current is 'false', class-id=50, method-id=10)
这意味着 autoDelete uri 参数适用于队列和交换器,如果它们不一致,您似乎已经被淘汰了。我在 rabbit 文档中找不到任何表明此配置错误的内容,并且管理工具让我可以毫无问题地设置此配置。
但是在http://camel.apache.org/rabbitmq.html 上找到的文档中提到了 exchangeArgsConfigurer 和 queueArgsConfigurer,这听起来很有希望。但是,没有关于可以传递哪些参数以及以何种格式传递的文档。我对来源的细读使我走上了一条死胡同。 (我要为一般的 Java 无知辩护,我必须在这里和那里涉足,但这不是我选择的语言)
那么在兔子绿洲喝骆驼做什么呢?
【问题讨论】:
-
我还看到 URI 中的 autodelete=true 无效的情况。此外,完全删除它并没有帮助,因为当我让 Camel 创建交换时,它仍然是
autodelete=false,即使默认值为true。
标签: java apache-camel rabbitmq