RabbitMQ启动报错:reply-code=404, reply-text=NOT_FOUND - no exchange ‘DLX‘ in vhost ‘/‘, class-id=60, met

本文介绍 RabbitMQ 中消息生产者与消费者的启动顺序问题,并提供了几个关键的注意事项来帮助开发者避免常见的配置错误。

解决办法
仅供参考

1、先查看注解是否使用正确(就是生产者和消费者上的注解是否有遗漏或者错误)

2、注意消费者队列的名称

3、第一次启动时先启动consumer,后启动provider。因为刚开始在mq中没有缓存的内容,在第二次等rabbitmq里面缓存了queue和exchange等信息就可以先启动provider了。

RabbitMQ中,报错 `reply-code=406, reply-text=PRECONDITION_FAILED` 通常表示某些前置条件未满足,以下是几种常见情况及对应的解决办法: #### 因double ack导致的报错 当出现 `Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)` 这类错误,可能是消费端重复确认消息(double ack)导致。解决办法是检查消费端代码,确保每条消息只被确认一次。以下是Python使用 `pika` 库消费消息时正确确认消息的示例: ```python import pika def callback(ch, method, properties, body): print("Received %r" % body) # 确认消息 ch.basic_ack(delivery_tag=method.delivery_tag) connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_consume(queue='hello', on_message_callback=callback) print('Waiting for messages. To exit press CTRL+C') channel.start_consuming() ``` #### 队列参数不匹配导致的报错 如果报错信息为 `PRECONDITION_FAILED - inequivalent arg 'x-message-ttl' for queue 'direct.info' in vhost '/test': received '3000' but current is '3000'`,这意味着在尝试声明队列时,传入的参数与队列当前的参数不一致。解决办法是确保声明队列时使用的参数与队列当前的参数一致。以下是Java使用Spring AMQP声明队列的示例: ```java import org.springframework.amqp.core.Queue; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Bean public Queue directInfoQueue() { // 确保参数与队列当前参数一致 return new Queue("direct.info", true); } } ``` #### 延时队列时间参数错误导致的报错 当出现 `PRECONDITION_FAILED - invalid expiration ‘1000*` 这类错误,可能是延时队列的时间参数使用了不合法的字符(如乘号 `*`)。解决办法是使用合法的时间参数。以下是使用RabbitMQ的TTL和DLX实现延时队列的Python示例: ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明死信交换器 channel.exchange_declare(exchange='dlx_exchange', exchange_type='direct') # 声明死信队列 channel.queue_declare(queue='dlx_queue') channel.queue_bind(queue='dlx_queue', exchange='dlx_exchange', routing_key='dlx_key') # 声明业务队列,并设置TTL和DLX arguments = { 'x-message-ttl': 3000, # 设置消息的TTL为3000毫秒 'x-dead-letter-exchange': 'dlx_exchange', 'x-dead-letter-routing-key': 'dlx_key' } channel.queue_declare(queue='business_queue', arguments=arguments) # 发送消息到业务队列 channel.basic_publish(exchange='', routing_key='business_queue', body='Delayed message') connection.close() ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值