iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >RabbitMQ实现WorkQueue工作队列的示例详解
  • 939
分享到

RabbitMQ实现WorkQueue工作队列的示例详解

RabbitMQWorkQueue工作队列RabbitMQWorkQueueRabbitMQ工作队列 2023-01-10 12:01:24 939人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

RabbitMQ Work Queue工作队列 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消

RabbitMQ Work Queue工作队列

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

相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。

多个消费者绑定到一个队列,同一条消息只会被一个消费者处理。

但是对于工作队列,可以提高消息的处理速度,避免队列中的消息堆积。

我们以一个例子来解释work queue工作队列。在生产者的服务中添加测试方法,通过循环的方式,向名为simple.queue队列中发送50条消息,代码和详细描述如下:

package cn.itcast.MQ.spring;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Test
    public void testSendMessage2WorkQueue() throws InterruptedException {
        String queueName="simple.queue";//队列名称
        String message = "hello, message_";//发送的消息
        for (int i=1;i<=50;i++){
            rabbitTemplate.convertAndSend(queueName,message+i);
            Thread.sleep(20);
        }
    }
}

在消费者的服务模块中,定义两个消息监听,分别为listenSimpleQueue1和listenSimpleQueue2,让它们都监听simple.queue队列,并且设置休眠时间,使得消费者1每秒处理50条消息,消费者2每秒处理10条消息。

package cn.itcast.mq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.time.LocalTime;
@Component
public class SpringRabbitListener {
    @RabbitListener(queues="simple.queue")
    public void listenSimpleQueue1(String msg) throws InterruptedException {
        System.out.println("消费者1已经接收到simple.queue的消息:[" + msg +  "]"+ LocalTime.now());
        Thread.sleep(20);
    }
    @RabbitListener(queues="simple.queue")
    public void listenSimpleQueue2(String msg) throws InterruptedException {
        System.err.println("消费者2已经接收到simple.queue的消息:[" + msg +  "]"+LocalTime.now());
        Thread.sleep(200);
    }
}

消费者的application.yaml文件,设置消费者每次只能获取一条消息,生产者和消费者的配置文件相似。

logging:
  pattern:
    datefORMat: MM-dd HH:mm:ss:SSS
spring:
  RabbitMQ:
    host: 192.168.220.13*
    port: 5672
    username: user
    passWord: ******
    virtual-host: /
    Listener:
      simple:
        prefetch: 1 #每次只能获取一条消息,处理完成才能获取下一条消息 控制消费者预取消息的上限

处理完成后,运行项目,可以得到消费者1和消费者2都能消费消息,并且可以根据休眠时间有序进行工作。

到此这篇关于RabbitMQ实现Work Queue工作队列的示例详解的文章就介绍到这了,更多相关RabbitMQ Work Queue内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: RabbitMQ实现WorkQueue工作队列的示例详解

本文链接: https://www.lsjlt.com/news/177278.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作