RabbitMQ学习篇3_快速入门案例、原生操作举栗、4种模式、解决报错com.rabbitmq.client.ShutdownSignalException: connection error

本文介绍了RabbitMQ的快速入门案例,包括简单模式、工作模式、发布与订阅模式(fanout、direct、topic)。通过Java代码展示了生产者Producer和消费者Consumer的实现,并详细解释了不同模式下的消息分发机制。同时,针对Windows环境下创建连接对象失败的问题给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

  • 快速入门案例

    1. 简单模式
    2. 工作模式
    3. 发布与订阅模式
      • fanout
      • direct
      • topic
  • 举栗

    1. 生产者Producer代码
    2. 一些说明
    3. 消费者Consumer代码
    4. 一些说明
    5. windows下创建连接对象失败报错解决
一、快速入门案例

查看官网的 教程RabbitMQ Tutorials :https://www.rabbitmq.com/getstarted.html,共有4种mq的模式场景(fanout、direact、topic、headers)

1. 隐式交换机简单模式:单个消费者

在这里插入图片描述

2. 隐式交换机工作模式:多个消费者,分发模式有轮询、公平分发
  • 轮询分发:默认情况下,RabbitMQ 将按顺序将每条消息发送给下一个消费者。平均而言,每个消费者都会收到相同数量的信息。这种分发消息的方式称为循环。
  • 公平分发:按照权重分发
    在这里插入图片描述
  • 消息确认:如果消费者在接受完任务之后,突然出故障,这时需要有 消息确认 机制 接着mq将未处理的信息重新放入队列分发处理在这里插入图片描述
3. 显示交换机模式
  • 需要一个 exchange交换机binding,交换类型有: direct, topic, headers and fanout
  • direct, topic, headers and fanout 是交换机 和 队列之间的关系
  • binding 是队列和消费者之间的关系,消费者绑定队列 才能收到信息
1.fanout发布与订阅模式
  • fanout只是将它接收的所有消息广播到它知道的所有队列
  • 消费者binding 指定队列才能接收到信息

在这里插入图片描述

2.direct路由交换模式
  • 上面的基础上,向它添加一个功能 ,使得只能订阅邮件的子集成为可能。订阅发布是 队列和消费者 之间的关系。

  • 不在使用fanout交换 将使用direct交换。直接交换背后的路由算法很简单 - 消息转到其binding key与消息的routing key完全匹配的队列。

    在这里插入图片描述

direct交换方式下设置相同的binding key 效果和 fanout类似

在这里插入图片描述

3.topic模式
  • 相当于增加了模糊匹配的direct交换方式

在这里插入图片描述

4.举栗
生产者Producer代码
package henu.soft.xiaosi.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {

    public static void main(String[] args) {

        // 所有的中间件技术都是基于TCP\IP协议之上构建新型的协议规范,主不过rabbitmq遵循amqp协议 ip、port


        /**
         * 原生方式使用rabbitmq
         */
        // 1. 创建连接工厂

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
//        factory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;

        try {
            // 2. 创建连接Connection

            connection = factory.newConnection("生产者");


            // 3. 通过连接获取管道channel

            channel = connection.createChannel();


            // 4. 创建交换机,声明队列、绑定关系、路由key、发送消息、接受信息

            String queueName = "xiaosi";

            /**
             * 参数:
             * 队列名称
             * 是否需要持久化
             * 排他性
             * 是否自动删除(最后一个消费者消费完是否删除队列
             * 携带附加参数
             */

            channel.queueDeclare(queueName,false,false,false,null);

            // 5. 准备消息内容
            String msg = "RabbitMQ~~";


            // 6. 发送消息到queue

            channel.basicPublish("",queueName,null,msg.getBytes());

            System.out.println("消息发送成功!");


        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            try {
                // 7. 关闭通道
                if(channel != null && channel.isOpen()){
                    channel.close();
                }
                // 8. 关闭连接
                if(connection != null && channel.isOpen()){
                    connection.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }


        }


    }
}

一些说明

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

请添加图片描述

消费者Cosumer代码
package henu.soft.xiaosi.simple;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {

    public static void main(String[] args) {

        // 所有的中间件技术都是基于TCP\IP协议之上构建新型的协议规范,主不过rabbitmq遵循amqp协议 ip、port


        /**
         * 原生方式使用rabbitmq
         */
        // 1. 创建连接工厂

        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
//        factory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;

        try {
            // 2. 创建连接Connection

            connection = factory.newConnection("消费者");


            // 3. 通过连接获取管道channel

            channel = connection.createChannel();


            // 4. 从哪个队列取


            String queueName = "xiaosi";


            channel.basicConsume(
                    queueName,
                    true,
                    new DeliverCallback() {
                        public void handle(String consumerTag, Delivery message) throws IOException {
                            System.out.println("消费者受到消息:" + new String(message.getBody(), "UTF-8"));
                        }

                    },
                    new CancelCallback() {
                        public void handle(String consumerTag) throws IOException {
                            System.out.println("消费者接受消息失败!");

                        }
                    });


            System.out.println("开始接受新消息!");
            System.in.read();


        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally {
            try {
                // 7. 关闭通道
                if (channel != null && channel.isOpen()) {
                    channel.close();
                }
                // 8. 关闭连接
                if (connection != null && channel.isOpen()) {
                    connection.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (TimeoutException e) {
                e.printStackTrace();
            }


        }


    }
}



一些说明

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.获取连接对象 factory.newConnection("生产者");报错
  • windows下使用java原生连接rabbitmq的时候,获取连接失败,输出:com.rabbitmq.client.ShutdownSignalException: connection error; protocol meth

  • 解决需要执行:rabbitmqctl set_permissions -p "/" 登录的username ".*" ".*" ".*"

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scl、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值