RabbitMQ 六种基本队列模式 ----- 简单消息队列(Hello World)

RabbitMQ 是一个消息代理:它接受和转发消息。您可以将其视为邮局:当您将要投递的邮件放入邮箱时,您可以确定信件承运人最终会将邮件递送给您的收件人。在这个比喻中,RabbitMQ 是一个邮箱、一个邮局和一个信件载体。

https://img2022.cnblogs.com/blog/1106277/202201/1106277-20220128155822710-274167202.png

在上图 “P” 是我们的生产者,“C” 是我们的消费者。中间的盒子是一个队列——RabbitMQ 代表消费者保留的消息缓冲区。再简单模式里面一个生产者只对应一个消费者

使用 java 实现简单的消息队列模式


  • 我们来使用 java 实现这个简单的消息模式,首先导入 Maven 坐标。

    <!-- <https://mvnrepository.com/artifact/com.rabbitmq/amqp-client> -->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.9.0</version>
    </dependency>
    
    <!-- <https://mvnrepository.com/artifact/org.slf4j/slf4j-simple> -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.25</version>
    <!--            <scope>test</scope>-->
    </dependency>
    
  • 创建一个消费者(C)用来接收生产者(P)发来的消息

    public static void main(String[] args) {
       
        try {
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            // 设置参数
            factory.setHost("192.168.3.64");
            factory.setPort(5672);
            factory.setVirtualHost("/default_virtual_host");
            factory.setUsername("admin");
            factory.setPassword("admin");
            // 创建一个新的代理链接
            Connection connection = factory.newConnection();
            // 创建一个新的频道
            Channel channel = connection.createChannel();
            // 创建一个队列
            channel.queueDeclare("hello_world", true, false, false, null);
    				// 创建接收消息的回调
            DeliverCallback deliverCallback = (String consumerTag, Delivery message) -> {
                String s = new String(message.getBody(), StandardCharsets.UTF_8);
    	          System.out.println(s);
            };
            channel.basicConsume("hello_world", true, deliverCallback, consumerTag -> {});
            // 释放资源 由于消费者需要一直接收所以不需要关闭
    //            channel.close();
    //            connection.close();
        } catch (Exception e) {
            e.fillInStackTrace();
        }
    }
    
  • 创建一个生产者(P)用来发送消息

    public static void main(String[] args) {
      
        try {
            //创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            // 设置参数
            factory.setHost("192.168.3.64");
            factory.setPort(5672);
            factory.setVirtualHost("/default_virtual_host");
            factory.setUsername("admin");
            factory.setPassword("admin");
            // 创建一个新的代理链接
            Connection connection = factory.newConnection();
            // 创建一个新的频道
            Channel channel = connection.createChannel();
            // 声明一个队列
            channel.queueDeclare("hello_world", true, false, false, null);
            // 发送消息
            String message = "这里是要发送的消息内容,比如我这个就是Hello World";
            channel.basicPublish("", "hello_world", null, message.getBytes(StandardCharsets.UTF_8));
            // 释放资源
            channel.close();
            connection.close();
        } catch (Exception e) {
            e.fillInStackTrace();
        }
    }
    
  • 启动生产者和消费者的服务

    • 启动生产者(P) 之后内容控制台返回的信息

      https://img2022.cnblogs.com/blog/1106277/202201/1106277-20220128155822589-1209663961.png

    • 查看 RabbitMQ Management 的信息,因为这时候还没有启动消费者(P)的服务所以下面会展示 Ready 状态的有一条消息

      https://img2022.cnblogs.com/blog/1106277/202201/1106277-20220128155822717-1576810117.png

    • 启动刚刚写的消费者(C)的服务,这时候就能看到控制到返回了一条消息

      https://img2022.cnblogs.com/blog/1106277/202201/1106277-20220128155822647-1056521101.png

    • 这时候 RabbitMQ Management 中为 Ready 状态的消息就为零了,因为被消费者的服务给消费掉了

      https://img2022.cnblogs.com/blog/1106277/202201/1106277-20220128155822810-242904974.png

posted @ 2022-01-28 16:01  奔跑的砖头  阅读(168)  评论(0编辑  收藏  举报