RabbitMQ
MQ消息队列
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法
**消息传递:**指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
**排队:**指的是应用程序通过队列来通信。
AMQP和JMS
AMQP
AMQP是一种协议,是一种binary wire-level protocol(连接协议)。
JMS
JMS即Java消息服务(JavaMessage Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
RabbitMQ工作模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FiphHgrg-1609593987919)(C:/Users/%E5%BC%A0%E9%91%AB/AppData/Roaming/Typora/typora-user-images/image-20201208194825596.png)]
//创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//主机地址;默认为 localhost
connectionFactory.setHost("localhost");
//连接端口;默认为 5672
connectionFactory.setPort(5672);
//虚拟主机名称;默认为 /
connectionFactory.setVirtualHost("/");
//连接用户名;默认为guest
connectionFactory.setUsername("guest");
//连接密码;默认为guest
connectionFactory.setPassword("guest");
//创建连接
Connection connection = connectionFactory.newConnection();
// 创建频道
Channel channel = connection.createChannel();
queue:队列名称
durable:是否持久化,当mq重启之后,还在
exclusive:是否独占。只能有一个消费者监听这队列当Connection关闭时,是否删除队列
autoDelete:是否自动删除。当没有Consumer时,自动删除掉
arguments:参数。
exchange:交换机名称。简单模式下交换机会使用默认的 ""
routingKey:路由名称
props:配置信息
body:发送消息数据
在一个队列中如果有多个消费者,那么消费者之间对于同一个消息的关系是竞争的关系。
2. Work Queues 对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。例如:短信服务部署多个,只需要有一个节点成功发送即可。
订阅模式类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CcD4kAve-1609593987922)(C:/Users/%E5%BC%A0%E9%91%AB/AppData/Roaming/Typora/typora-user-images/image-20201208194859980.png)]
在订阅模型中,多了一个exchange角色,而且过程略有变化:
- P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)
- C:消费者,消息的接受者,会一直等待消息到来。
- Queue:消息队列,接收消息、缓存消息。
- Exchange:交换机,图中的X。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。Exchange有常见以下3种类型:
- Fanout:广播,将消息交给所有绑定到交换机的队列
- Direct:定向,把消息交给符合指定routing key 的队列
- Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列
Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,那么消息会丢失!
发布订阅模式:
1、每个消费者监听自己的队列。
2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息
交换机需要与队列进行绑定,绑定之后;一个消息可以被多个消费者都收到
Routing路由模式:
- 队列与交换机的绑定,不能是任意绑定了,而是要指定一个
RoutingKey
(路由key) - 消息的发送方在 向 Exchange发送消息时,也必须指定消息的
RoutingKey
。 - Exchange不再把消息交给每一个绑定的队列,而是根据消息的
Routing Key
进行判断,只有队列的Routingkey
与消息的Routing key
完全一致,才会接收到消息
Consumer consumer = new DefaultConsumer(channel){
/*
回调方法,当收到消息后,会自动执行该方法
1. consumerTag:标识
2. envelope:获取一些信息,交换机,路由key...
3.