RabbitMQ和SpringBoot整合之填坑 com.rabbitmq.client.ShutdownSignalException: channel error protocol method:

RabbitMQ消息中间连两端链接上消息生产者,消息消费者

但是在整合SpringBoot,且版本在

<spring-boot.version>2.6.13</spring-boot.version>

消息消费者,启动报错

消息发送者消息发送报错,

com.rabbitmq.client.ShutdownSignalException: channel error protocol method:

追踪问题根源是,队列,交换机,绑定这些都不存在,所以出现了问题,

解决办法很见简单

1.自己手动到RabbitMQ里面创建相关的交换机,队列,绑定关系

2.代码端解决

消息消费者

使用如下

package com.example.rabbitmqb.config;


import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;


@Component
public class RabbitMQConfig {

    @RabbitListener(queuesToDeclare = {@Queue("boot_queue")})
    public void ListenerQueues(Message message) throws UnsupportedEncodingException {
        System.out.println(new String(message.getBody(), "UTF-8"));
    }

}

消息生产端配置类

package com.example.rabbitmqa.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Configuration;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.context.annotation.Bean;

@Configuration
public class RabbitMQConfig2 {

//    @Bean
//    RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
//        return new RabbitAdmin(connectionFactory);
//    }

    public static final String EXCHANGE_NAME = "boot_topic_exchange";
    public static final String QUEUE_NAME = "boot_queue";

    //1.交换机
    @Bean("bootExchange")
    public TopicExchange bootExchange(RabbitAdmin rabbitAdmin) {

        TopicExchange exchange = new TopicExchange(EXCHANGE_NAME);
        rabbitAdmin.declareExchange(exchange);
        return exchange;
    }

    //2.Queue 队列
    @Bean("bootQueue")
    public Queue bootQueue(RabbitAdmin rabbitAdmin) {
        Queue queue = new Queue(QUEUE_NAME, true);
        rabbitAdmin.declareQueue(queue);
        return queue;
    }

    //3. 队列和交互机绑定关系 Binding
    /*
        1. 知道哪个队列
        2. 知道哪个交换机
        3. routing key
     */
    @Bean
    public Binding bindQueueExchange(@Qualifier("bootQueue") Queue queue,
                                     @Qualifier("bootExchange") Exchange exchange,
                                     RabbitAdmin rabbitAdmin) {
        Binding binding = BindingBuilder.bind(queue).to(exchange).with("boot.#").noargs();
        rabbitAdmin.declareBinding(binding);
        return binding;
    }


    //创建初始化RabbitAdmin对象
    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
        RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);
        // 只有设置为 true,spring 才会加载 RabbitAdmin 这个类
        rabbitAdmin.setAutoStartup(true);
        return rabbitAdmin;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用的信息,报错信息"channel error; protocol method: #method(channel.close)(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)"表示在使用RabbitTemplate操作消息队列时发生了通道错误。这个错误可能是由于未知的投递标签或者无法满足预设条件导致的。根据引用的信息,当使用@RabbitListener注解时,会自动进行ACK确认,如果在方法中再次手动ACK确认,会导致重复ACK而出错。为了解决这个问题,可以在@RabbitListener注解中添加ackMode = "MANUAL"参数,来手动配置ACK模式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [springboot集成RabbitMq异常 Channel shutdown: channel error; protocol method](https://blog.csdn.net/qq_38082304/article/details/103049696)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Channel shutdown: channel errorprotocol method](https://blog.csdn.net/weixin_43474695/article/details/107500673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值