RabbitMQ消息模型之Work消息模型

Work消息模型

* work模型:
*      多个消费者消费同一个队列中的消息,每个消费者获取到的消息唯一,且只能消费一次
*      作用:提高消息的消费速度,避免消息的堆积
*      默认采用轮询的方式分发消息
*      如果某个消费者处理消息慢,会导致消息堆积
生产者
package com.example.demo02.mq.work;import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;import java.io.IOException;
import java.util.concurrent.TimeUnit;/*** @author Allen* 4/10/2024 9:37 PM* @version 1.0* @description: work模式发送者** work模型:*      多个消费者消费同一个队列中的消息,每个消费者获取到的消息唯一,且只能消费一次*      作用:提高消息的消费速度,避免消息的堆积*      默认采用轮询的方式分发消息*      如果某个消费者处理消息慢,会导致消息堆积*/
public class WorkSender {public static void main(String[] args) throws Exception {
//        1:获取连接Connection connection = ConnectionUtils.getConnection();
//        2:创建通道Channel channel = connection.createChannel();
//        3:声明队列// 参数1:队列名称 参数2:是否持久化 参数3:是否排他性 参数4:是否自动删除 参数5:队列的属性channel.queueDeclare("work.queue", false, false, false, null);
//        4:发送100条消息
for (int i = 0; i < 100; i++) {String msg = "work模式消息" + i;//休眠i*5毫秒TimeUnit.MILLISECONDS.sleep(i * 5);// 参数1:交换机名称 参数2:队列名称 参数3:消息的其他属性 参数4:消息的内容channel.basicPublish("", "work.queue", null, msg.getBytes());System.out.println("work模式发送消息:" + msg);}
//        5:关闭通道channel.close();
//        6:关闭连接connection.close();}
}
消费者1

(能者多劳角色)

package com.example.demo02.mq.work;import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;import java.io.IOException;/*** @author Allen* 4/10/2024 9:37 PM* @version 1.0* @description: work模式消费者1号*/
public class WorkReciver1 {public static void main(String[] args) throws Exception {// 1:获取连接Connection connection = ConnectionUtils.getConnection();// 2:创建通道Channel channel = connection.createChannel();// 3:声明队列// 参数1:队列名称 参数2:是否持久化 参数3:是否排他性 参数4:是否自动删除 参数5:队列的属性channel.queueDeclare("work.queue", false, false, false, null);// 4:定义消费者,消费消息// 参数1:队列名称 参数2:是否自动确认消息 参数3:消费者对象Consumer consumer = new DefaultConsumer(channel) {// 消费者接收消息调用此方法// 参数1:消费者标签 参数2:队列参数 参数3:消息属性 参数4:消息内容@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {// 获取消息String msg = new String(body);System.out.println("work模式消费者1号接收消息:" + msg);channel.basicAck(envelope.getDeliveryTag(), false);}};channel.basicConsume("work.queue", false, consumer);}
}
消费者2

(消费能力差)

package com.example.demo02.mq.work;import com.example.demo02.mq.util.ConnectionUtils;
import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeUnit;/*** @author Allen* 4/10/2024 9:37 PM* @version 1.0* @description: work模式消费者1号*/
public class WorkReciver2 {public static void main(String[] args) throws Exception {// 1:获取连接Connection connection = ConnectionUtils.getConnection();// 2:创建通道Channel channel = connection.createChannel();// 3:声明队列// 参数1:队列名称 参数2:是否持久化 参数3:是否排他性 参数4:是否自动删除 参数5:队列的属性channel.queueDeclare("work.queue", false, false, false, null);//如果此消费者性能较差,配置能者多劳:指定一次获取几条信息,消息消费成功后 ack之后 mq才会发送下一条消息channel.basicQos(1);// 4:定义消费者,消费消息// 参数1:队列名称 参数2:是否自动确认消息 参数3:消费者对象Consumer consumer = new DefaultConsumer(channel) {// 消费者接收消息调用此方法// 参数1:消费者标签 参数2:队列参数 参数3:消息属性 参数4:消息内容@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {//模拟二号消费者处理消息慢try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}// 获取消息:执行业务String msg = new String(body);System.out.println("work模式消费者2号接收消息:" + msg);channel.basicAck(envelope.getDeliveryTag(), false);}};// 参数1:队列名称 参数2:ACK是否自动确认 参数3:消费者对象//必须手动确认消息,否则会报406错误channel.basicConsume("work.queue", false, consumer);}
}
结果:

能者多劳

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机/飞控--ArduPilot、PX4学习记录(5)

这几天看dronekit&#xff0c;做无人机失控保护。 PX4官网上的经典案例&#xff0c;我做了很多注解&#xff0c;把代码过了一遍。 无人机具体执行了&#xff1a; 先起飞&#xff0c;飞至正上空10m->向北移动10m->向东移动10m->向南移动10m->向西移动10m->回到初…

白学的小知识[属性操作.节点遍历操作.CSS-DOM操作]

属性操作&#xff1a; attr() 用来获取与设置元素属性 。 $newNode4.attr("alt");//获取alt属性值 //或 $("img").attr({width:"50px",height:"100px"});//设置width、height属性的值 $("img[idmyimg]").attr("src&quo…

mysql题目5

tj11&#xff1a; select max(c.teacher_age) 最大的年龄 from tb_teacher c tj12: select a.class_name 班级名称,b.student_name 学生姓名,b.gender 学生性别 from tb_class a join tb_student b on a.class_idb.class_id join tb_teacher c on a.teacher_idc.teacher_id w…

kubekey 离线安装harbor、k8s、kubesphere

目录 参考文献 了解kubekey 英文和中文 前提条件 部署准备 下载kubukey 离线包配置和制作 配置离线包 制作离线包 离线安装集群 复制KubeKey 和制品 artifact到离线机器 创建初始换、安装配置文件 安装镜像仓库harbor 初始化harbor 项目 修改配置文件 安装k8s集…

使用Python实现高斯混合模型聚类算法

高斯混合模型&#xff08;Gaussian Mixture Model&#xff0c;GMM&#xff09;是一种基于概率分布的聚类方法&#xff0c;它假设数据集由若干个高斯分布组成&#xff0c;每个高斯分布代表一个簇。在本文中&#xff0c;我们将使用Python来实现一个基本的高斯混合模型聚类算法&am…

实战--------部署搭建ELFK+zookeeper+kafka架构

目录 一、部署jdk环境 二、搭建Elasticsearch 三、搭建logstash 四、搭建kibana服务 五、搭建filebeat服务 六、搭建zookeeper与kafka服务 七、部署ELFKzookeeperkafka Filebeat/Fluentd&#xff1a;负责从各服务器节点上实时收集日志数据&#xff0c;Filebeat轻量级&am…

面试八股——Spring——AOP与事务

AOP的定义 事务的实现 事务的失效场景 异常捕获处理 下图中由于②导致异常&#xff1a; 原因&#xff1a; 解决办法&#xff1a;自己抛出一个非检查异常&#xff08;具体原因看“抛出检查异常”&#xff09;。 抛出检查异常 由于①出错&#xff0c;导致抛出了检查异常 原因&…

[通俗易懂:Linux标准输入/输出和重定向]Shell脚本之 > /dev/null 2>1命令详解

目录标题 一、> /dev/null 2>&1 命令解析二、/dev/null 文件浅显理解三、标准输入、标准输出、标准错误输出四、输入重定向、输出重定向五、命令作用与应用场景 如果想看命令意义&#xff0c;可以直接跳到第五部分 一、> /dev/null 2>&1 命令解析 我们在别…

ubuntu spdlog 封装成c++类使用

安装及编译方法&#xff1a;ubuntu spdlog 日志安装及使用_spdlog_logger_info-CSDN博客 h文件&#xff1a; #ifndef LOGGING_H #define LOGGING_H#include <iostream> #include <cstring> #include <sstream> #include <string> #include <memor…

计算机服务器中了360后缀勒索病毒怎么办?360后缀勒索病毒解密步骤

网络技术的不断应用与发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;利用网络可以开展各项工作业务&#xff0c;可以大大提高企业的生产效率&#xff0c;然而&#xff0c;网络是一把双刃剑&#xff0c;在为企业提供便利的同时&#xff0c;也为企业的数据安全带来…

常见的Linux命令

linux操作系统 ctrl鼠标滚动 放大缩小字体 cd /目录进入目录下 ls查看当前目录下的所有内容 tar -zxvf 压缩包名字 对压缩包进行解压 sync将数据由内存同步到硬盘上 shutdown关机指令 shutdown -h 10 /10 表示十分钟后关机 shutdown -h now 表示现在关机 shutdown -h…

Linux系统命令三剑客awk

一、awk引子 awk是 Linux 里命令里处于【扫地僧】的地位 awk是一门语言&#xff0c;也是一个命令。 最擅长处理文本的语言或命令 Linux有三剑客命令&#xff1a; grep/sed/awk 三剑客各自特长&#xff1a; grep #过滤内容 sed #取行 awk #取列 --- 取行 --- 过滤一、 二…

英语新概念2-回译法-lesson6

我刚刚搬家去柏林大街的房子里。昨天一个流浪汉敲我的门,他想我寻求一顿饭和一杯啤酒。未拒绝了这个请求之后,这个流浪汉倒立着唱歌,我给他了一顿饭,他吃了食物并且喝了啤酒,然后他把一片奶酪放到他的口袋里然后走开了。过了一会儿,一个领居告诉我关于这个流浪汉的事情。…

Centos7 K8S 集群 - kubeadm搭建方式

机器准备 搭建环境是centos7, 四核心4G内存四台机器 一个master节点&#xff0c;一个etcd&#xff0c;两台node 机器名称IP 地址master192.168.1.127node1192.168.1.129node2192.168.1.130node3192.168.1.131 机器时间同步 各节点时间要求精确同步&#xff0c;可以直接联网…

算法设计与分析(超详解!) 第二节 递归与分治

1.递归定义 直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。 由分治法产生的子问题往往是原问题的较小模式&#xff0c;这就为使用递归技术提供了方便。在这种情况下&#xff0c;反复应用分治手段&#xff0c;可以使子问题与原问题类型一致…

【备战蓝桥杯】2024蓝桥杯赛前突击省一:图论模版篇

2024蓝桥杯赛前模版突击&#xff1a;图论篇 图论在蓝桥杯中一般考的不难&#xff0c;如果有图论的题&#xff0c;就基本是模板题&#xff0c;知道板子就有分了。 邻接表 本文使用方法1的方式实现邻接表 邻接表1 static int[] dist new int[N],st new int[N]; static int…

LeetCode-热题100:226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a; root [4,2,7,1,3,6,9] 输出&#xff1a; [4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a; root [2,1,3] 输出&#xff1a; […

我为什么不放弃独立博客

背景 我为什么要写博客&#xff1f;为什么要自己搭博客网站&#xff1f;要搭什么样的博客网站&#xff1f;哪些功能有意义哪些没有意义&#xff1f; 分析 独立博客&#xff0c;我没有放弃&#xff01; 我为什么要写博客&#xff1f;为什么要自己搭博客网站&#xff1f;要搭什…

GlusterFS 分布式文件系统 搭建及使用

一、GlusterFS GlusterFS 是一个开源的分布式文件系统&#xff0c;旨在提供高性能、可扩展性和可靠性&#xff0c;适用于现代数据中心和云环境。它以横向扩展的方式设计&#xff0c;可以在多台服务器之间共享文件系统&#xff0c;为应用程序提供统一的文件存储服务。 Gluster…

【React Router】初识路由(中)

加载数据 这一节主要强调 URL、布局和数据 的解耦。 在根模块文件中创建并导出一个加载器函数&#xff0c;并配置到路由。 getContacts() 是我们自己封装的数据请求 API&#xff0c;新增的数据暂时存储到 localforage。 export async function loader() {const contacts a…