前言

本章我们来一次快速入门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)查看管控台

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

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

队列中多了test001队列。

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

(3)运行生产端



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

(4) 问题

注意:

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

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

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


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

并没有设置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(四)命令行与管控台的基本操作!

消息中间件——RabbitMQ(五)快速入门生产者与消费者,SpringBoot整合RabbitMQ!的更多相关文章

  1. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. RabbitMQ入门到进阶(Spring整合RabbitMQ&SpringBoot整合RabbitMQ)

    1.MQ简介 MQ 全称为 Message Queue,是在消息的传输过程中保存消息的容器.多用于分布式系统 之间进行通信. 2.为什么要用 MQ 1.流量消峰 没使用MQ 使用了MQ 2.应用解耦 ...

  3. springboot整合rabbitmq实现生产者消息确认、死信交换器、未路由到队列的消息

    在上篇文章  springboot 整合 rabbitmq 中,我们实现了springboot 和rabbitmq的简单整合,这篇文章主要是对上篇文章功能的增强,主要完成如下功能. 需求: 生产者在启 ...

  4. 一篇学习完rabbitmq基础知识,springboot整合rabbitmq

    一   rabbitmq 介绍 MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced MessageQueue 高级消息队列协议 ...

  5. 功能:SpringBoot整合rabbitmq,长篇幅超详细

    SpringBoot整合rabbitMq 一.介绍 消息队列(Message Queue)简称mq,本文将介绍SpringBoot整合rabbitmq的功能使用 队列是一种数据结构,就像排队一样,遵循 ...

  6. springboot学习笔记-6 springboot整合RabbitMQ

    一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...

  7. 【MQ中间件】RabbitMQ -- SpringBoot整合RabbitMQ(3)

    1.前言说明 前面一篇博客中提到了使用原生java代码进行测试RabbitMQ实现多种交换机类型的队列场景.但是在项目中我们一般使用SpringBoot项目,而且RabbitMQ天生对于Spring的 ...

  8. 【SpringBoot系列5】SpringBoot整合RabbitMQ

    前言: 因为项目需要用到RabbitMQ,前几天就看了看RabbitMQ的知识,记录下SpringBoot整合RabbitMQ的过程. 给出两个网址: RabbitMQ官方教程:http://www. ...

  9. SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...

随机推荐

  1. 洛谷 P4363 [九省联考2018]一双木棋chess 题解

    题目链接:https://www.luogu.org/problemnew/show/P4363 分析: 首先博弈,然后考虑棋盘的规则,因为一个子在落下时它的上面和左面都已经没有空位了,所以棋子的右下 ...

  2. Storm之API简介

    Storm之API简介 Component组件 1)基本接口 (1)IComponent接口 (2)ISpout接口 (3)IRichSpout接口 (4)IStateSpout接口 (5)IRich ...

  3. RabbitMQ延迟消息的延迟极限是多少?

    之前在写Spring Cloud Stream专题内容的时候,特地介绍了一下如何使用RabbitMQ的延迟消息来实现定时任务.最近正好因为开发碰到了使用过程中发现,延迟消息没有效果,消息直接就被消费了 ...

  4. (读论文)推荐系统之ctr预估-DeepFM模型解析

    今天第二篇(最近更新的都是Deep模型,传统的线性模型会后面找个时间更新的哈).本篇介绍华为的DeepFM模型 (2017年),此模型在 Wide&Deep 的基础上进行改进,成功解决了一些问 ...

  5. linux初学者-用户管理篇

    linux的用户管理是非常以后工作中重要的一部分,也是linux系统安全的防线. 1.用户理解 那么到底什么是用户呢?用户就是系统使用者的身份. 用户是以怎样的方式储存在计算机中的呢?在系统中用户存储 ...

  6. github项目readme.md文件如何编写

    参考链接:http://blog.csdn.net/Bone_ACE/article/details/48318675

  7. ASP.NET Core MVC 之布局(Layout)

    1.什么是布局 布局通常包含常见的用户界面元素,例如应用头,导航或菜单元素和页脚,如图: 常见的HTML结构(例如脚本和样式表)也经常被应用程序中许多页面使用.所有这些共享元素都可以在布局中定义,然后 ...

  8. SSM整合环境搭建demo

    1.项目目录结构 2.项目中用的jar包 3.web.xml(其中主要配置spring与springmvc) <?xml version="1.0" encoding=&qu ...

  9. spring的jdbcTemplate的使用

    转载:http://1358440610-qq-com.iteye.com/blog/1826816 一.首先配置JdbcTemplate: 要使用Jdbctemplate 对象来完成jdbc 操作. ...

  10. C# StackTrace

    StackTrace trace = new StackTrace(); //获取是哪个类来调用的 Type type = trace.GetFrame().GetMethod().Declaring ...