• 六、工作队列


    工作队列,用于多个消费者从队列中消费多个消息。

    工作队列(又称:任务队列)背后的主要思想是避免立即执行资源密集型任务,并且必须等待它完成。相反,我们安排任务稍后完成。我们将任务封装 为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当您运行许多工作程序时,它们之间将共享任务。

    这个概念在Web应用程序中特别有用,因为在短的HTTP请求窗口中无法处理复杂的任务。

    工作队列程序

    生产者发送消息:

    /**
     * @author Hayson
     * @date 2018/11/23 13:39
     * @description rabbitmq生产者发送多条消息
     */
    public class Send {
        final static String QUEUE = "helloWorld";
        public static void main(String[] args) throws IOException, TimeoutException {
            send();
        }
        public static void send() throws IOException, TimeoutException {
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();
            // 没声明交换器,使用默认交换器
            channel.queueDeclare(QUEUE, false, false, false, null);
            for (int i = 0; i < 5; i++) {
                String message = "Hello World! " + i;
                //发送消息,指定发送交换器(""则为自带默认交换器)
                channel.basicPublish("", QUEUE, null, message.getBytes("UTF-8"));
                System.out.println("发送消息:" + message);
            }
            channel.close();
            connection.close();
        }
    }
    

    消费者接收消息1:

    /**
     * @author Hayson
     * @date 2018/11/23 13:41
     * @description rabbitmq消费者接收消息1
     */
    public class Receiver2 {
        final static String QUEUE = "helloWorld";
        public static void main(String[] args) throws IOException, TimeoutException {
            recevier();
        }
        public static void recevier() throws IOException, TimeoutException {
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE, false, false, false, null);
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                        throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println("接收到消息:" + message);
                }
            };
            channel.basicConsume(QUEUE, true, consumer);
            //channel.close();
            //connection.close();
        }
    }
    

    消费者接收消息2:

    /**
     * @author Hayson
     * @date 2018/11/23 13:41
     * @description rabbitmq消费者接收消息2
     */
    public class Receiver2 {
        final static String QUEUE = "helloWorld";
        public static void main(String[] args) throws IOException, TimeoutException {
            recevier();
        }
        public static void recevier() throws IOException, TimeoutException {
            Connection connection = ConnectionUtils.getConnection();
            Channel channel = connection.createChannel();
            channel.queueDeclare(QUEUE, false, false, false, null);
            Consumer consumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
                        throws IOException {
                    String message = new String(body, "UTF-8");
                    System.out.println("接收到消息:" + message);
                }
            };
            channel.basicConsume(QUEUE, true, consumer);
            //channel.close();
            //connection.close();
        }
    }
    

    先启动上面两个消费者客户端监听队列消息,后启动生产者发送消息,结果如下:

    生产者:

    发送消息:Hello World! 0
    发送消息:Hello World! 1
    发送消息:Hello World! 2
    发送消息:Hello World! 3
    发送消息:Hello World! 4
    

    消费者1:

    接收到消息:Hello World! 0
    接收到消息:Hello World! 2
    接收到消息:Hello World! 4
    

    消费者2:

    接收到消息:Hello World! 1
    接收到消息:Hello World! 3
    

    可以看到,RabbitMQ将按顺序将每条消息发送给下一个消费者。平均而言,每个消费者将获得相同数量的消息。这种分发消息的方式称为轮询法。上面还可以发送更多的消息和添加更多的消费者监听队列。

  • 相关阅读:
    python os.walk()和os.path.walk()
    python学习之random模块
    java性能优化文章
    mysql和workbench的安装、创建实例、用户
    32位、64位与Java开发研究分析
    Web缓存
    深入分析 Java 中的中文编码问题
    eclipse+tomcat(eclipse自带插件) JSP修改后不生效问题
    今天给2010买的三星R428升级一下固态硬盘
    href="javascript:xxx(this);"和onclick="javascript:xxx(this);"的区别
  • 原文地址:https://www.cnblogs.com/zenghi-home/p/10065258.html
Copyright © 2020-2023  润新知