热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ消息中间件快速入门:SpringBoot整合生产者与消费者

前言本章我们来一次快速入门RabbitMQ——生产者与消费者。需要构建一个生产端与消费端的模型。什么意思呢?我们的生产者发送一条消息,投递到RabbitMQ集群也就是Broker。

求关注

快速入门生产者与消费者,SpringBoot整合RabbitMQ!


前言

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

我们的消费端进行监听RabbitMQ,当发现队列中有消息后,就进行消费。


1. 环境准备

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


2.大概步骤

我们来看下大概步骤:



  • ConnectionFacorty:获取连接工厂

  • Connection:一个连接

  • Channel:数据通信信道,可发送和接收消息

  • Queue:具体的消息存储队列

  • Producer & Consumer 生产者和消费者

这个连接工厂需要配置一些相应的信息,例如: RabbitMQ节点的地址,端口号,VirtualHost等等。

Channel是我们RabbitMQ所有消息进行交互的关键。


3. 项目实战


3.1 连接工厂


/**
*
* @ClassName: ConnectionUtils
* @Description: 连接工具类
* @author Coder编程
* @date 2019年6月21日 上午22:28:22
*
*/
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 生产端


/**
*
* @ClassName: Producer
* @Description: 生产者
* @author Coder编程
* @date 2019年7月30日 上午21:04:43
*
*/
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 消费端


/**
*
* @ClassName: Consumer
* @Description: 消费端
* @author Coder编程
* @date 2019年7月30日 上午21:08:12
*
*/
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);

底层代码

第一个参数:queuename:队列的名称

第二个参数:durable 是否持久化。true消息会持久化到本地,保证重启服务后消息不会丢失

第三个参数:exclusive :表示独占方式,设置为true 在某些情景下有必要,例如:顺序消费。表示只有一个channel可以去监听,其他channel都不能够监听。目的就是为了保证顺序消费。

第四个参数:autoDelete:队列如果与Exchange未绑定,则自动删除

第五个参数:arguments:扩展参数


channel.basicConsume(QUEUE_NAME, true, consumer);

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


3.5 运行程序

(1)启动消费端

启动消费端

(2)查看管控台

Overview

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

Connections

Channels

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

queues

队列中多了test001队列。


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


(3)运行生产端

运行生产端

消费端收到消息

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

(4) 问题

注意:

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

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

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


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

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

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

默认Exchange

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


文末


欢迎关注个人微信公众号:Coder编程

获取最新原创技术文章和免费学习资料,更有大量精品思维导图、面试资料、PMP备考资料等你来领,方便你随时随地学习技术知识!

新建了一个qq群:315211365,欢迎大家进群交流一起学习。谢谢了!也可以介绍给身边有需要的朋友。



文章收录至

Github: https://github.com/CoderMerlin/coder-programming

Gitee: https://gitee.com/573059382/coder-programming

欢迎关注并star~

微信公众号


参考文章:

https://www.cnblogs.com/myJavaEE/p/6665166.html

《RabbitMQ消息中间件精讲》

推荐文章:

消息中间件——RabbitMQ(二)各大主流消息中间件综合对比介绍!

消息中间件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP协议!

消息中间件——RabbitMQ(四)命令行与管控台的基本操作!



推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
author-avatar
风飞满天2602938511
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有