首页 > 其他分享 >RabbitMQ系列学习笔记(三)--工作队列模式

RabbitMQ系列学习笔记(三)--工作队列模式

时间:2024-10-16 20:45:57浏览次数:9  
标签:String -- RabbitMQ 队列 模式 系列学习 public channel 消费者

文章目录

本文参考
尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq
RabbitMQ 详解
Centos7环境安装Erlang、RabbitMQ详细过程(配图)

一、工作队列模式原理

image.png
与简单模式相比,工作队列模式(Work Queue)多了一些消费者,该模式也是使用 direct 交换机,应用于处理消息较多的情况,对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度
工作队列模式实际上是一种竞争关系的模式,多个消费者之间是竞争关系,即一条消息如果被某个消费者消费了,那么其他的消费者就获取不到了。特点如下:

  • 一个队列对应多个消费者。
  • 一条消息只会被一个消费者消费。
  • 消息队列默认采用 轮询 的方式将消息平均发送给消费者。

二、工作队列模式实战

1、抽取工具类

通过前边简单模式的实践发现,其实无论是生产者还是消费者,在代码实现中是有共通点的,我们可以将前期建立连接获取信道的代码片段抽取出来,形成一个工具类。

public class RabbitMqUtil {
	//得到一个连接的 channel
	public static Channel getChannel() throws Exception {
    	//创建一个连接工厂并建立连接 
        ConnectionFactory factory = new ConnectionFactory(); 
        factory.setHost("192.168.222.139"); 
    	factory.setUsername("admin"); 
        factory.setPassword("scr1pt_yang.");
    	Connection connection = factory.newConnection(); 
        Channel channel = connection.createChannel(); 
    	return channel;
	}
}

2、消费者代码

工作队列模式的消费者与简单模式的消费者代码实现上没有区别,只是消费者数量增加了。

/**
 * Description: 工作队列模式消费者01
 */
public class Consumer01 {
    //队列名称
    private static final String QUEUE_NAME = "work_queue";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtil.getChannel();
        // 创建队列
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        System.out.println("C1等待接收消息.....");
        channel.basicConsume(QUEUE_NAME, true, 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);
            }
        });
    }
}
/**
 * Description: 工作队列模式消费者02
 */
public class Consumer01 {
    //队列名称
    private static final String QUEUE_NAME = "work_queue";

    public static void main(String[] args) throws Exception {
        Channel channel = RabbitMqUtil.getChannel();
        System.out.println("C2等待接收消息.....");
        channel.basicConsume(QUEUE_NAME, true, 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);
            }
        });
    }
}

3、生产者代码

生产者代码逻辑比较简单,获取到channel以后直接通过channel.basicPublish()发送消息即可。

/**
 * Description: 工作队列模式生产者
 */
public class Producer {
    //队列名称
    private static final String QUEUE_NAME = "work_queue";

    public static void main(String[] args) throws Exception {
        // 1.通过工具类建立信道
        Channel channel = RabbitMqUtil.getChannel();
        // 2.从控制台获取输入,并将其作为消息发送消息队列
        Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()){
			String message = scanner.next(); 
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes()); 
			System.out.println("生产者发出消息:"+message);
		}
        // 3.关闭资源
        channel.close();
    }
}

4、查看运行结果

先将消费者启动,因为消费者1的代码中负责声明了work_queue队列,再启动生产者进行消息的发送。image.pngimage.pngimage.png
通过上述执行结果可以发现在工作队列工作模式下,消息队列是通过轮询的方式将消息轮流发送给所有消费者,当第一条消息到达消费者1时,消费者2则不能接收到这条消息,同理反之亦然。两者接受到的消息是互斥的。

标签:String,--,RabbitMQ,队列,模式,系列学习,public,channel,消费者
From: https://blog.csdn.net/m0_51621836/article/details/142964293

相关文章

  • 常见文件头、文件尾
    1、图片JPEG文件头:FFD8FF文件尾:FFD9PNG文件头:89504E470D0A1A0A文件尾:AE426082GIF文件头:4749463839(37)61文件尾:003BBMP文件头:424D文件头标识(2bytes)42(B)4D(M)TIFF(tif)文件头:49492A00Ico文件头:00000100AdobePhotoshop(psd)文件头:38425053TGA未压缩的前4字......
  • mysql的时间在vue中显示相差8个小时 (Vue+Django+MySQL 时区 自动转换时间)
    mysql的时间在vue中显示相差8个小时 Vue     10:00:00Django (USE_TZ=True,Django会自动根据所设的时区对时间进行转换;改为False即可)MySQL  2:00:00 =========================原因:中间某个环节的时区不对. 我这里是mysql的时区不对.解决办法:......
  • 2-STM32F103+ML307(中移4G Cat1)OTA升级篇(自建物联网平台)-STM32通过ML307使用http或
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/myota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明前面......
  • 设计思想py 前置后置处理python脚本
    fromflaskimportFlask,request,jsonifyimportjsonapp=Flask(__name__)#用于存储前置和后置脚本pre_script='''defpre_process(data):#在这里编写你的前置处理逻辑returndata'''post_script='''defpost_process(response):......
  • .NET周刊【10月第2期 2024-10-13】
    国内文章C#/.NET/.NETCore优秀项目和框架2024年9月简报https://www.cnblogs.com/Can-daydayup/p/18457705文章介绍了多个与C#.NET和ASP.NET相关的优秀开源项目和框架,包括AvaloniaUI、WaterCloud、CodeMaid、NetCoreServer等。这些项目各具特色,涵盖UI设计、快速开发、代码简化......
  • 如何把一个python列表(有很多个元素)变成一个excel表格的第一列?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者群有个叫【麦当】的粉丝问了一个关于Python如何把一个python列表(有很多个元素)变成一个excel表格的第一列的问题,这里拿出来给大家分享下,一起学习。二、解决过程这里给出【dcpeng】和【德善堂小儿推拿-瑜亮老师】大佬......
  • SciTech-AV-Audio-DAP(Digital Audio Processing)-Loudness Normalization(响度规范化
    LoudnessNormalizationUsetheLoudnessNormalizationtochangetheleveloftheaudio(normallyreduceittorecommendedlimits).ItisbasedonEBUR128recommendationsonlimitingtheloudnessofaudiosignals.SeePerceivedLoudnessforthetechnical......
  • ArkTS基础语法:
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • Map中的具体实现子类HashMap
    一、HashMapHashMap<Student3,String>Map的唯一性指的是键的唯一性,HashMap中需要键的类型要重写hashCode()方法和equals方法二、HashMap的使用1.编写Student3类,里面需要重写hashCode()方法和equals方法importjava.util.Objects;publicclassStudent3{privateStrin......
  • 代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜
    学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课用前序遍历构造二叉树二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。二叉搜索树的搜索和验证时不关心遍历顺序,因......