RabbitMQ学习一(快速入门、详细图片版)

RabbitMQ学习一(快速入门)

1、RabbitMQ的安装

  1. 直接拉取dockerHub上的最新镜像

    docker pull rabbitmq
    
  2. 创建rabbitMQ容器并运行

    1、可以通过如下命令查看运行的容器

    docker ps
    

    2、创建MQ容器

    docker run -d --hostname my-rabbit --name some-rabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost rabbitmq:3-management
    

    根据官网给出的示例修改如下

    docker run \
     -e RABBITMQ_DEFAULT_USER=itcast \
     -e RABBITMQ_DEFAULT_PASS=123321 \
     --name mq \
     --hostname mq1 \
     -p 15672:15672 \
     -p 5672:5672 \
     -d \
     rabbitmq
    

    -p 15672:15672 管理平台端口

    -p 5672:5672 消息队列端口

    –hostname mq1 主机名称,集群部署是必须的

  3. 创建成功后,浏览器访问管理平台

    访问路径:宿主机IP:15672

    密码就是上面设置的itcast123321

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R40kTdft-1653987749408)(images/1、访问管理端.png)]

    如果拉取的是最新的版本,可能会访问不到管理平台,需要找一下解决方法

RabbitMQ中的一些角色:
  • publisher:生产者
  • consumer:消费者
  • exchange个:交换机,负责消息路由
  • queue:队列,存储消息
  • virtualHost:虚拟主机,隔离不同租户的exchange、queue、消息的隔离

2、RabbitMQ消息模型(快速人门)

RabbitMQ官方提供了5个不同的Demo示例,对应了不同的消息模型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pBfxVNW-1653987749409)(images/image-20220531093901212.png)]

  1. 入门案例

    简单队列模式的模型图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wlCiwgg8-1653987749410)(images/image-20220531094048075.png)]

    官方的HelloWorld是基于最基础的消息队列模型来实现的,只包括三个角色:

    • publisher:消息发布者,将消息发送到队列queue
    • queue:消息队列,负责接受并缓存消息
    • consumer:订阅队列,处理队列中的消息
  2. Helloworld案例

    创建一个springboot聚合工程,里面有publisherconsumer两个子过程,在里面各自创建消息发布的测试代码和订阅队列的测试代码

    需要将setHost连接的端口改为当前宿主机的端口

    publisher测试代码
    package cn.itcast.mq.helloworld;
    
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import org.junit.Test;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class PublisherTest {
          
          
        @Test
        public void testSendMessage() throws IOException, TimeoutException {
          
          
            // 1.建立连接
            ConnectionFactory factory = new ConnectionFactory();
            // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
            factory.setHost("192.168.26.131");
            factory.setPort(5672);
            factory.setVirtualHost("/");
            factory.setUsername("itcast");
            factory.setPassword("123321");
            // 1.2.建立连接
            Connection connection = factory.newConnection();
    
            // 2.创建通道Channel
            Channel channel = connection.createChannel();
    
            // 3.创建队列
            String queueName = "simple.queue";
            channel.queueDeclare(queueName, false, false, false, null);
    
            // 4.发送消息
            String message = "hello, rabbitmq!";
            channel.basicPublish("", queueName, null, message.getBytes());
            System.out.println("发送消息成功:【" + message + "】");
    
            // 5.关闭通道和连接
            channel.close();
            connection.close();
    
        }
    }
    
    

    登录RabitMQ管理端实时查看发布的消息通道和队列消息

    1. debug运行我们的PublisherTest测试类发送消息

      断电位置:

      15行

      23行

      26行

      29行

    2. 查看rabitmq的管理端

      执行完23行后查看管理页面,建立连接

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NkS2Ag3x-1653987749410)(images/2、建立连接.png)]

    3. 执行完26行完成创建通道Channel

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ljter8fq-1653987749411)(images/3、创建通道.png)]

    4. 执行完后面代码,完成消息对象创建并发送消息

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N4CuCejX-1653987749412)(images/4、消息队列.png)]

      点击Name的队列名称可以进去队列查看

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XcsPYvn6-1653987749412)(images/5、查看消息队列.png)]

    5. 当测试程序执行完后,就会将之前的建立连接通道都关闭,只剩下消息队列
    consumer测试代码
    package cn.itcast.mq.helloworld;
    
    import com.rabbitmq.client.*;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    public class ConsumerTest {
          
          
    
        public static void main(String[] args) throws IOException, TimeoutException {
          
          
            // 1.建立连接
            ConnectionFactory factory = new ConnectionFactory();
            // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
            factory.setHost("192.168.26.131");
            factory.setPort(5672);
            factory.setVirtualHost("/");
            factory.setUsername("itcast");
            factory.setPassword("123321");
            // 1.2.建立连接
            Connection connection = factory.newConnection();
    
            // 2.创建通道Channel
            Channel channel = connection.createChannel();
    
            // 3.创建队列
            String queueName = "simple.queue";
            channel.queueDeclare(queueName, false, false, false, null);
    
            // 4.订阅消息
            channel.basicConsume(queueName, true, new DefaultConsumer(channel){
          
          
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope,
                                           AMQP.BasicProperties properties, byte[] body) throws IOException {
          
          
                    // 5.处理消息
                    String message = new String(body);
                    System.out.println("接收到消息:【" + message + "】");
                }
            });
            System.out.println("等待接收消息。。。。");
        }
    }
    
    

    启动运行获取队列的程序

    执行流程与上面的一致,那么为什么再次创建队列呢?这是因为生产者和消费者的启动顺序不一样,所以避免没有队列就一起都创建一个管道,而我们的rabbitmq也并不会因为生产者和消费者都创建队列而重复的创建

    消费者一旦消费就会销毁该消息

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IeyHLP1q-1653987749413)(images/6、销毁.png)]

总结

基本消息队列的消息发送流程:

  1. 建立connection

  2. 创建channel

  3. 利用channel声明队列

  4. 利用channel向队列发送消息

基本消息队列的消息接收流程:

  1. 建立connection

  2. 创建channel

  3. 利用channel声明队列

  4. 定义consumer的消费行为handleDelivery()

  5. 利用channel将消费者与队列绑定

猜你喜欢

转载自blog.csdn.net/baidu_39378193/article/details/125069297