RabbitMQ 学习 -->> 5、Work Queues 轮询

5、Work Queues 轮询

工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。

相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。

在后台运行的工作进程将弹出任务并最终执行作业。

当有多个工作线程时,这些工作线程将一起处理这些任务。工作进程就相当于消费者

RabbitMQ 工作时会采取轮询机制完成消息消费,保证每个消息都会被消费并且只被消费一次,消费者之间是竞争关系,轮流抢夺消费信息。

开启两个工作进程,由一个生产者发送大量消息,观察轮询机制

Worker
public class Worker01 {

    public static void main(String[] args) throws IOException, TimeoutException {

        Channel channel = CommonUtil.getChannel("192.168.126.129", "3aniuma", "123456");

        DeliverCallback deliverCallback = (consumerTag, message)->{
            System.out.println("接收到的消息:"+new String(message.getBody()));
        };

        CancelCallback cancelCallback = (consumerTag)->{
            System.out.println("消息消费被中断");
        };

        System.out.println("Worker03等待接收消息");

        channel.basicConsume("hello",true,deliverCallback,cancelCallback);

    }

}

开启两个工作线程,选一个before launch task[为了在你切换线程之间做修改及时编译,默认不自动编译],再选一个 Allow multiple instances 【这个就是表示开启这个程序允许开多线程】

请添加图片描述

task
public class Task01 {

    public static void main(String[] args) throws IOException, TimeoutException {

        Channel channel = CommonUtil.getChannel("192.168.126.129","3aniuma","123456");
        /**
         * 生成一个队列
         *  参数
         *  1.队列名称
         *  2.队列里面的消息是否持久化 默认消息存储在内存中
         *  3.该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费
         *  4.是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
         *  5.其他参数
         */
        channel.queueDeclare("hello",false,false,false,null);

        /**
         * 发送一个消息
         *  1.发送到那个交换机
         *  2.路由的 key 是哪个
         *  3.其他的参数信息
         *  4.发送消息的消息体
         */
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){

            String message = scanner.next();

            channel.basicPublish("","hello",null,message.getBytes(StandardCharsets.UTF_8));

            System.out.println(message+"消息发送完毕!!");
        }

    }

}

观察运行结果可以发现,工作线程【消费者】们之间遵循轮询消费机制,你一个我一个的接受消息


版权声明:本文为m0_55668855原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。