当前位置: 首页 > 知识库问答 >
问题:

Apache Camel,RabbitMQ:在autodelete=true的交换上使用autodelete=false的队列

贺俊楚
2023-03-14

我在camel中设置了一个简单的泵,它使用以下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中的autodelete参数,则在运行代码时会出现错误,这些错误归结为:

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)

如果我进入管理工具并手动创建队列,将autodelete设置为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上找到的文档中有对ExchangeArgsConfiguorer和QueueArgsConfiguorer的引用,这听起来很有希望。但是,没有关于可以传递什么参数和以什么格式传递的文档。我对源头的细读使我走上了一条死胡同。(我要为一般Java的无知辩护,我在必要的时候到处涉猎,但它不是我的选择)

那骆驼在兔子绿洲喝什么呢?

共有1个答案

侯焱
2023-03-14

我以前也遇到过类似的问题,我找到的唯一解决方案是声明消费者端的队列与生产者生成的队列相等(相同),请看下面的内容:

Amqp客户端未连接到activemq服务器。

 类似资料:
  • 问题内容: 我需要一个可以在重新启动的RabbitMQ服务器交换上发现队列的python客户端,然后启动一个客户端以继续使用每个队列中的消息。如何从某些RabbitMQ兼容的python api /库中发现队列? 问题答案: 据我所知,没有任何办法可以做到这一点。这与Python无关,但是因为AMQP没有定义任何队列发现方法。 无论如何,在AMQP中,都是由客户端(消费者)声明队列的:发布者使用路

  • 我已经开始使用RabbitMQ,我的用例非常简单——生产者将消息放在队列中,由消费者处理。每条消息最多由一个消费者处理,消息根据队列名称从生产者定向到消费者。 < code >直接交换看起来非常好,并且< code >默认交换是< code >直接交换。 是否有任何原因(性能、管理、许可等)不使用交换并创建自己的交换?例如,我将使用高可用性队列(https://www.rabbitmq.com/h

  • RabbitMQ在下列情况下会循环分发消息吗? RabbitMQ配置: 交换类型-主题 路由密钥-通知# 制片人正在将消息推送到上面的交流中,并遵循以下不同的主题 - notify.log.# , notify.status.#, notify.priceChange.# 有4个消费者在不同的服务器上运行。 > 3个消费者在负载均衡器下执行相同的处理并在同一应用程序的不同实例上运行。(他们想消费生

  • 我是新手RabbitMQ java客户端。我的问题:我创建了10个consumer并将它们添加到队列中。每个消费者使用10秒来处理我的流程。我检查了Rabbit的页面,我看到我的队列有4000条消息没有发送到客户端。我检查了日志客户端,结果是为一个消费者获取一条消息,10秒后,我为一个消费者获取一条消息,依此类推…我想要得到10个消息为所有消费者在当时(10个消息-10消费者过程在当时)请帮助我,

  • 我们有一个队列和交换集群来支持消息。 null 我们每个队列都有一个交换,以便在重试超时期间后将重试的消息发送回特定的队列。 在这个场景中,我们有3个交换(“foo-exchange”、“foo-exchange-dead”、“baz-exchange-retry(每个队列1个fanout exchange)”和3个队列(“baz-queue”、“baz-queue-delay”、“baz-que

  • 是否有可能为带有“直接”类型的Rabbitmq交换设置一些“默认”队列? 比如,我有一个exchange A,队列Q1、Q2、Q3和QDef。因此,如果使用路由密钥Q1发布某个消息,它将转到Q1。但如果消息使用路由密钥Q4,则它应该转到QDef。若路由密钥不是现有队列的名称,则消息应转到QDef。 有可能做兔子吗?也许交换不应该是“直接”类型,而应该是其他类型? 换句话说。如果某个消费者为某个路由