1.RabbitMQ
1.RabbitMq是什么?
MQ全称为Message Queue,即消息队列, RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。RabbitMQ官方地址:http://www.rabbitmq.com/
开发中消息队列通常有如下应用场景:
1)、任务异步处理。
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
2)、应用程序解耦合 MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
2.市场上还有哪些消息队列?
ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ、Redis。
3.为什么使用RabbitMQ呢?
1、使得简单,功能强大。
2、基于AMQP协议。
3、社区活跃,文档完善。
4、高并发性能好,这主要得益于Erlang语言。
5、Spring Boot默认已集成RabbitMQ
2.RabbitMQ的工作原理
组成部分说明如下:
Broker:消息队列服务进程,此进程包括两个部分:
Exchange和Queue。
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
消息发布接收流程:
-----发送消息----
1、生产者和Broker建立TCP连接。
2、生产者和Broker建立通道。
3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
4、Exchange将消息转发到指定的Queue(队列)
----接收消息----
1、消费者和Broker建立TCP连接
2、消费者和Broker建立通道
3、消费者监听指定的Queue(队列)
4、当有消息到达Queue时Broker默认将消息推送给消费者。
5、消费者接收到消息。
5.测试
1) 创建maven工程 创建生产者工程和消费者工程,分别加入RabbitMQ java client的依赖。
test-rabbitmq-producer:生产者工程
test-rabbitmq-consumer:消费者工程
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp‐client</artifactId>
<version>4.0.3</version>
<!‐‐此版本与spring boot 1.5.9版本匹配‐‐>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐logging</artifactId>
</dependency>
2)消费者
//队列名称
private static final String QUEUE = "helloworld";
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
//创建与RabbitMQ服务的TCP连接
connection = factory.newConnection();
//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务
channel = connection.createChannel();
//声明队列
//pram1:队列名称,param2:是否持久化,pram3:队列是否独占此连接,param4:队列不再使用时是否自动删除此队列,param5:队列参数
channel.queueDeclare(QUEUE, true, false, false, null);
String message = "helloworld小明"+System.currentTimeMillis();
//消息发布
//param1:Exchange的名称,如果没有指定,则使用Default Exchange
//param2:routingKey,消息的路由Key,是用于Exchange(交换机)将消息转发到指定的消息队列
//param3:消息包含的属性
//param4:消息体
channel.basicPublish("", QUEUE, null, message.getBytes());
3)消费者
ConnectionFactory factory = new ConnectionFactory();
//设置MabbitMQ所在服务器的ip和端口
factory.setHost("127.0.0.1");
factory.setPort(5672);
//创建与RabbitMQ服务的TCP连接
Connection connection = factory.newConnection();
//创建与Exchange的通道,每个连接可以创建多个通道,每个通道代表一个会话任务
Channel channel = connection.createChannel();
//声明队列
channel.queueDeclare(QUEUE, true, false, false, null);
DefaultConsumer consumer = new DefaultConsumer(channel) {
@Override
//param1: @param consumerTag 消费者的标签,在channel.basicConsume()去指定
//param2:消息包的内容,可从中获取消息id,消息routingkey,交换机,消息和重传标志 (收到消息失败后是否需要重新发送)
//properties
//body
public void handleDelivery(String consumerTag,Envelope envelope,AMQP.BasicProperties properties,byte[] body)throws IOException {
//交换机
String exchange = envelope.getExchange();
//路由key
String routingKey = envelope.getRoutingKey();
//消息id
long deliveryTag = envelope.getDeliveryTag();
//消息内容
String msg = new String(body,"utf‐8");
System.out.println("receive message.." + msg); }
}
//队列名称,是否自动回复,消息消费的方法
channel.basicConsume(QUEUE, true, consumer);
6.总结
1、发送端操作流程
1)创建连接
2)创建通道
3)声明队列
4)发送消息
2、接收端
1)创建连接
2)创建通道
3)声明队列
4)监听队列
5)接收消息
6)ack回复
7.rabbit-mq的工作模式
1、Work queues
2、Publish/Subscribe
3、Routing
4、Topics
5、Header
6、RPC
最新文章
- 《----css样式---------浮动带来的影响与解决方法---------------》
- mvc+webapi 项目架构
- (转载)Linux如何编译安装源码包软件
- Window Server 2012 R2 下 IE11 浏览器 无法安装Flash 怎么解决
- django models auto_now和auto_now_add的区别
- android DisplayMetrics 获取屏幕分辨率
- vbox下Oracle Enterprise liunx5.4虚拟机安装10G RAC实验(三)
- 收集的maven 仓库地址(maven repository)
- 算法库:boost安装配置
- 【C#】 一些不常用,很容易混淆的知识点
- maven eclipse miss required library解决
- 将文件放到Android模拟器的SD卡
- oracle学习系列之四 (视图)
- 【BZOJ】【1037】【ZJOI2008】生日聚会party
- C#入门教程(一)–.Net平台技术介绍、C#语言及开发工具介绍-打造C#学习教程
- less学习-语法(二)
- OA请假流程 -- 编码
- 在ubuntu上安装k-vim
- LuoguP1196_银河英雄传说_KEY
- Opencv(C++)实现邻近插值算法
热门文章
- Spring IOC&;DI 控制反转和依赖注入
- JSRE中的多任务与多线程
- 体验用yarp连接websocket
- .NET Protobuf包装器库
- 高德地图 JS API (jsp + miniui(子页面数据返回父页面并设值) + 单个点标记 + 点标记经纬度 + 回显 + 限制地图显示范围+搜索)
- Java 如何对文件进行多个Object对象流的读写操作
- [cf1326F]Wise Men
- [luogu1438]无聊的数列
- 多线程合集(二)---异步的那些事,async和await原理抛析
- 【 [SCOI2016]幸运数字】