消息中间件——RabbitMQ(五)快速入门生产者与消费者,SpringBoot整合RabbitMQ!

news2024/11/16 15:31:08

前言

本章我们来一次快速入门RabbitMQ——生产者与消费者。需要构建一个生产端与消费端的模型。什么意思呢?我们的生产者发送一条消息,投递到RabbitMQ集群也就是Broker。
我们的消费端进行监听RabbitMQ,当发现队列中有消息后,就进行消费。

1. 环境准备

本次整合主要采用SpringBoot框架,需要对SpringBoot的使用有一定了解。

2.大概步骤

我们来看下大概步骤:

  • ConnectionFacorty:获取连接工厂
  • Connection:一个连接
  • Channel:数据通信信道,可发送和接收消息
  • Queue:具体的消息存储队列
  • Producer & Consumer 生产者和消费者

这个连接工厂需要配置一些相应的信息,例如: RabbitMQ节点的地址,端口号,VirtualHost等等。
Channel是我们RabbitMQ所有消息进行交互的关键。

3. 项目实战

3.1 连接工厂


public class ConnectionUtils {
    public static Connection getConnection() throws IOException, TimeoutException {
        //定义连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //设置服务地址
        factory.setHost("127.0.0.1");
        //端口
        factory.setPort(5672);//amqp协议 端口 类似与mysql的3306
        //设置账号信息,用户名、密码、vhost
        factory.setVirtualHost("/vhost_cp");
        factory.setUsername("user_cp");
        factory.setPassword("123456");
        // 通过工程获取连接
        Connection connection = factory.newConnection();
        return connection;
    }
}

3.2 生产端


public class Producer {

	
	public static void main(String[] args) throws Exception {
	
		System.out.println("Producer start...");
		
		//1 创建ConnectionFactory
		Connection connection = ConnectionUtils.getConnection();
		
		//2 通过connection创建一个Channel
		Channel channel = connection.createChannel();
		
		//3 通过Channel发送数据
for(int i=0; i < 5; i++){
			String msg = "Hello RabbitMQ!";
			//1 exchange   2 routingKey 
			channel.basicPublish("", "test001", null, msg.getBytes());
		}

		//4 记得要关闭相关的连接
		channel.close();
		connection.close();
	}
}


3.3 消费端


public class Consumer {

	public static void main(String[] args) throws Exception {
		
		System.out.println("Consumer start...");
		
		//1 创建ConnectionFactory
		Connection connection = ConnectionUtils.getConnection();
		
		//2通过connection创建一个Channel
		Channel channel = connection.createChannel();
		
		//3声明(创建)一个队列
		String queueName = "test001";
		channel.queueDeclare(queueName, true, false, false, null);
		
		//4创建消费者
		QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
		
		//5设置Channel
		channel.basicConsume(queueName, true, queueingConsumer);
		
		while(true){
			//6 获取消息
			Delivery delivery = queueingConsumer.nextDelivery();
			String msg = new String(delivery.getBody());
			System.err.println("消费端: " + msg);
			//Envelope envelope = delivery.getEnvelope();
		}
		
	}
}



3.4 源码解析


channel.queueDeclare(queueName, true, false, false, null);

第一个参数:queue:队列的名称
第二个参数:durable 是否持久化。true消息会持久化到本地,保证重启服务后消息不会丢失
第三个参数:exclusive :表示独占方式,设置为true 在某些情景下有必要,例如:顺序消费。表示只有一个channel可以去监听,其他channel都不能够监听。目的就是为了保证顺序消费。
第四个参数:autoDelete:队列如果与Exchange未绑定,则自动删除
第五个参数:arguments:扩展参数


channel.basicConsume(QUEUE_NAME, true, consumer);

第二个参数 autoAck:自动签收消息

3.5 运行程序

(1)启动消费端

(2)查看管控台

可以看到已经有一个连接,一个信道,一个消费者等信息了。

可以看到信道目前的状态是空闲状态。

队列中多了test001队列。

关于管控台的介绍可以看这篇文章:消息中间件——RabbitMQ(四)命令行与管控台的基本操作!

(3)运行生产端

可以看到生产端发送完消息之后停下了,消费端迅速接收到了消息。也可以继续通过管控台观察消费的情况。

(4) 问题

注意:

这里面可能有一个问题:为什么要先启动消费端呢?

因为在消费端创建的队列,我们必须要有队列,才能够发送消息。

另一个问题:在生产端代码中:


channel.basicPublish("", "test001", null, msg.getBytes());

并没有设置exchange,只设置了队列名称,消费端却依然能够消费到消息,这是为什么呢?

答:发消息的一定要指定Exchange,如果不指定Exchange或者Exchange为空的话,它会默认走第一个


它的路由规则:将相同命名的队列Queue的消息路由过去,如果路由不过去,将会把消息删除。

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

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

相关文章

Django之cookie和session

文章目录 Cookie的介绍Cookie的由来什么是CookieCookie原理Cookie覆盖浏览器查看Cookie 在Django中操作Cookie设置Cookie查询浏览器携带的Cookie删除Cookie Cookie校验登录sessionSession的由来Session设置查看、更新Session值删除Session值Seesion的其他方法Session的其他配置…

Atlassian Confluence 路径遍历和命令执行漏洞 (CVE-2019-3396)

漏洞描述 Confluence 是由澳大利亚软件公司 Atlassian 开发的基于 Web 的企业 wiki。 Atlassian Confluence 6.14.2 版本之前存在一个未经授权的目录遍历漏洞&#xff0c;攻击者可以使用 Velocity 模板注入读取任意文件或执行任意命令。 漏洞环境及漏洞利用 启动docker环境…

主播产品塑造话术

产品卖点 一、品质卓越 我们的产品始终坚持高品质的标准&#xff0c;从原材料的选择到生产工艺的把控&#xff0c;每一个环节都经过严格的品质检测。我们注重产品的耐用性和稳定性&#xff0c;确保您在使用过程中无需担心质量问题。 二、功能强大 我们的产品不仅具备基本的…

HTTP ERROR 403 No valid crumb was included in the request

1、报错截图&#xff1a; 2、产生原因&#xff1a; 开启了csrf&#xff0c;即跨站请求伪造 3、新版本不支持页面修改&#xff0c;故需要修改jenkins配置文件 3.1 进入编辑配置文件 vim /etc/sysconfig/jenkins 3.2 修改JENKINS_JAVA_OPTIONS&#xff0c;并保存修改 JENKI…

获取地区天气

上网找了半天js获取天气的方法&#xff0c;试了好几个都不行&#xff0c;还是得用api才行 1.用的心知天气的api 很简单,注册就能用,调用api需要key,官方网站&#xff1a;https://gaofen.mlogcn.com/documentation/0/00 2.areacode 这个网页里面找 精确到县&#xff1a;https:/…

mysql允许远程连接

1. 检查服务器防火墙 防火墙若开启则需要开放mysql使用的3306端口才可远程访问&#xff1b; 若无安全性要求也可以直接关闭防火墙。 防火墙相关命令&#xff1a; # 检查防火墙状态 systemctl status firewalld # 开启防火墙 systemctl start firewalld # 停止防火墙 systemctl …

【医学图像处理】超详细!PET图像批量预处理

目录 一、单个PET图像预处理1、使用[MRIConvert](https://pan.baidu.com/s/1cn3kgeVRir8HvP6HHm0M0Q?pwd5rt5)处理DCM2、MRI和PET数据预处理过程1&#xff09; 打开matlab命令行输入spm pet&#xff0c;打开SMP12&#xff0c;界面如下2&#xff09; Realign&#xff0c;只需要…

分布式锁之基于zookeeper实现分布式锁(三)

3. 基于zookeeper实现分布式锁 实现分布式锁目前有三种流行方案&#xff0c;分别为基于数据库、Redis、Zookeeper的方案。这里主要介绍基于zk怎么实现分布式锁。在实现分布式锁之前&#xff0c;先回顾zookeeper的相关知识点 3.1. 知识点回顾 3.1.1. 安装启动 安装&#xff1a…

面试送分题!“商品分类浏览”如何测试?

电商项目无论是工作中&#xff0c;还是面试中&#xff0c;都是一个高频出现的词。 面试官非常热衷提问关于电商项目的问题。例如商品分类怎么测试&#xff1f;购物车怎么测试&#xff1f;订单怎么测试&#xff1f;优惠券怎么测试&#xff1f;支付怎么测试&#xff1f;等等。 …

linux通过串口传输文件

简介 在嵌入式调试过程中&#xff0c;我们经常会使用调试串口来查看Log或者执行指令&#xff0c;其实&#xff0c;调试串口还有另一种功能&#xff0c;就是传输文件&#xff0c;本文说明使用MobaXterm串口工具来传输文件。 环境要求 嵌入式系统需要安装lsz和lrz&#xff0c;…

汲古融新,字有乾坤—字体设计商业项目实践

《字迹&#xff1a;字体设计商业项目实践》主要内容为商业字体设计&#xff0c;对于字体设计的理论知识进行透彻讲解&#xff0c;并配以详尽的设计案例。全书包含6章&#xff1a;第1章为字体设计基础知识&#xff0c;以梳理字体设计理论知识为主要内容&#xff1b;第2章为字体设…

01-详细介绍函数式接口和Lambda表达式语法

函数式接口介绍 如果在一个接口中只声明了一个抽象方法,则此接口就被称为函数式接口(该接口可以包含其他非抽象方法) 接口上使用FunctionalInterface注解可以验证该接口是否为函数式接口,javadoc生成的文档时也会保留该注解, 若接口中有多个抽象方法编译器会报错 随着Python…

一文详解Vue生命周期

Vue是一种流行的用于构建用户界面的渐进式JavaScript框架。Vue框架在开发过程中&#xff0c;特别强调对生命周期的理解和管理。通过使用生命周期钩子函数&#xff0c;开发者能够精确地控制Vue实例的创建、挂载、更新以及销毁过程。本文将对Vue的生命周期进行详细的介绍&#xf…

航天博物馆3D虚拟交互展厅让大众对科技发展有更深切的理解和感受

博物馆作为人们了解历史、文化和艺术的重要场所&#xff0c;现在可以通过VR全景技术来进行展览&#xff0c;让参观者身临其境地感受历史文化的魅力。本文将介绍博物馆VR全景的特点、优势&#xff0c;以及如何使用VR全景技术来使得博物馆的展览和教育活动更丰富。 VR数字博物馆…

2023年“福建省工业互联网+智能制造创新大赛”开启报名

11月22日&#xff0c;由福建省总工会、福建省大数据集团有限公司共同举办的2023年“福建省工业互联网智能制造创新大赛”启动报名。 大赛积极响应《福建省总工会等八部门关于广泛深入开展劳动和技能竞赛为新发展阶段新福建建设建工立业的意见》&#xff08;闽工〔2022〕70号&am…

String 真的不可变吗?

为什么 String 类不可变 final修饰符&#xff1a; String类被声明为final&#xff0c;这意味着它不能被继承。因此&#xff0c;无法创建String的子类来修改其行为。私有字符数组&#xff08;char[]&#xff09;&#xff1a; String类内部使用私有的字符数组来存储字符串的内容…

最优化理论

最优化理论 资料一optimal condition 最优性条件概念 二一维搜索逐次下降法iterative decent单峰函数二分法 dichotomous search 三 资料 B站最优化理论与算法 上交最优化方法 一 目标函数&#xff1a;需要优化的函数 决策变量&#xff0c;可以调整变化的量 约束集&#xff…

GitHub上8个强烈推荐的 Python 项目

文章目录 前言1. Manim2. DeepFaceLab3. Airflow4. GPT-25. XSStrike6. 谷歌图片下载7. Gensim8. SocialMapper总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③…

【Linux】 id命令使用

id id命令来显示用户的UID、组GID。 著者 由阿诺德罗宾斯和大卫麦肯齐撰写。 语法 id [参数] [用户名] id命令 -Linux手册页 命令选项及作用 执行令 id --help 执行命令结果 参数 -g 或 --group  显示用户所属群组的ID。-G 或 --groups  显示用户所属附加群组的ID。…