• RabbitMQ工作模式-工作队列


    官网关于工作模式的解释地址:https://www.rabbitmq.com/getstarted.html

    Work Queue(工作队列)

    生产者发消息,启动多个消费者来消费消息,每个消费者仅消费部分消息,可达到负载均衡的效果。

    在这里插入图片描述

    创建生产者

    import com.rabbitmq.client.BuiltinExchangeType;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import java.nio.charset.StandardCharsets;
    
    public class Product {
    
    
        public static void main(String[] args) throws Exception {
            ConnectionFactory factory = new ConnectionFactory();
    
            factory.setUri("amqp://root:123456@node1:5672/%2f");
    
            //创建连接和队列
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
    
    
            //声明队列,持久化,不自动删除
            channel.queueDeclare("qu.wk", true, false, false, null);
    
            //声明交换机,消息持久化,不自动删除
            channel.exchangeDeclare("ex.wk", BuiltinExchangeType.DIRECT, true, false, null);
    
            //队列和交换机绑定
            channel.queueBind("qu.wk", "ex.wk", "rk.wq");
    
            for (int i = 0; i < 20; i++) {
                //发送消息
                channel.basicPublish("ex.wk",
                        "rk.wq", null, ("data msg " + i).getBytes(StandardCharsets.UTF_8));
            }
    
    
            channel.close();
            connection.close();
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    创建消费者

    import com.rabbitmq.client.BuiltinExchangeType;
    import com.rabbitmq.client.CancelCallback;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.DeliverCallback;
    import com.rabbitmq.client.Delivery;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    
    public class Consumer {
    
        public static void main(String[] args) throws Exception {
            ConnectionFactory factory = new ConnectionFactory();
    
            factory.setUri("amqp://root:123456@node1:5672/%2f");
    
            Connection connection = factory.newConnection();
            Channel channel = connection.createChannel();
    
            //声明队列,持久化,不自动删除
            channel.queueDeclare("qu.wk", true, false, false, null);
    
            channel.basicConsume("qu.wk", new DeliverCallback() {
                @Override
                public void handle(String consumerTag, Delivery message) throws IOException {
                    System.out.println("收到的消息:" + new String(message.getBody(), StandardCharsets.UTF_8));
                }
            }, new CancelCallback() {
                @Override
                public void handle(String consumerTag) throws IOException {
                    System.out.println("cancel的消息:" + consumerTag);
                }
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    首先运行消息费,为了测试工作队列模式,消费都需要启动多个,看是否能够进行负载均衡操作。

    在IDEA中启动多个消费者,注意需要沟选启动运行参数:

    在这里插入图片描述

    此样例中启动是4个。

    在这里插入图片描述

    启动生产者,再观察消费者的输出信息:

    再次观察消费者的输出便可发现:

    在这里插入图片描述

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

    可以发现每个工作队列都收到了5条消息。

    此便可看出工作队列的一个重要特性,负载均衡。

  • 相关阅读:
    盘点AI的认证
    SQL注入的练兵场
    Mongodb分片环境搭建和验证(redis期末大作业)
    C#详解:程序域、程序集、模块、Type、反射
    【JavaEE初阶】线程安全的集合类
    基于WiFi小车控制板的单片机小系统原理图
    20240701给NanoPi R6C开发板编译友善之臂的Android12系统
    深入了解网络流量清洗--使用免费的雷池社区版进行防护
    Mybatis逆向工程的2种方法,一键高效快速生成Pojo、Mapper、XML,摆脱大量重复开发
    【Java盲点攻克】「数值浮点数精度系列」Double与Float的坑与解决办法以及BigDecimal的取而代之!
  • 原文地址:https://blog.csdn.net/bug_null/article/details/132591116