SpringAMQP (Work Queue 工作队列)案例

Work queue 工作队列,可以提高消息处理速度,避免队列消息堆积(和入门案例相比多挂了一个consumer)
SpringAMQP (Work Queue 工作队列)案例_第1张图片

案例 模拟WorkQueue,实现一个队列绑定多个消费者

基本思路如下:
1.

第一步实现代码

  @Test
    public void testSendMessage2WorkQueue() throws InterruptedException {
        String queueName = "simple.queue";
        String message = "hello,springAMQP message__";

        for (int i = 1; i <= 50; i++) {
            rabbitTemplate.convertAndSend(queueName, message + i );
            Thread.sleep(20); //暂停20ms 20ms*50 1000ms 用来模拟一秒产生50条消息
        }
    }

第二部实现代码

  @RabbitListener(queues = "simple.queue")
    public void listenWorkQueue1(String msg) throws InterruptedException {
        System.out.println("消费者1接收到的消息: ["+ msg +"]" + LocalTime.now());
        Thread.sleep(20); //模拟每秒处理50条
    }

    @RabbitListener(queues = "simple.queue")
    public void listenWorkQueue2(String msg) throws InterruptedException {
        System.err.println("消费者2接收到的消息: ["+ msg +"]" + LocalTime.now());
        Thread.sleep(200);  //模拟每秒处理5条
    }

结果如下(先开启消费者服务,再发消息)
SpringAMQP (Work Queue 工作队列)案例_第2张图片

存在的问题。

在你运行的时候会发现很慢,它没有很快就处理完,而是慢慢的(出现了队列消息堆积),这是为什么呢?大家可以仔细观察打印出来的结果每个消费者都消费了25条消息(问题就出在这),由于两个消费者处理消息的能力不同,但是默认情况下消息分配从一开始就会决定好分配默认的话,以轮询的方式把消息预取。

解决方法

让消费者每次只能拿走一条消息,处理完成之后在拿或者按照消费者处理消息的能力划分,这样的话就会明显感觉到处理变快了(下面是代码实现)。

    listener:
      simple:
        prefetch: 1 #每次只能获取一条消息,处理完成才能获取下一个消息

你可能感兴趣的:(SpringCloud,java,spring,cloud)