基本概念:
RabbitMQ是一种消息中间件,用来处理来自客服端的异步消息。服务端将要发送的消息放入到队列池中。接收端可以根据RabbMQ配置的转发机制接收服务端发来的消息。RabbitMQ依据指定的转发规则进行消息的转发、缓冲和持久化操作,主要用在多服务器间或单服务器的子系统间进行通信,是分布式系统标准的配置。
MQ典型应用场景:
- 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
- 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
- 日志处理
- 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。
AMQP模型:

正如图中所看到的,AMQP协议模型有三部分组成:生产者、消费者和服务端。
生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。
接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟 ,然后发送到不同的消息队列中,这样订阅了消息队列的消费者就可以获取到消息,进行消费。
最后还要关闭信道和连接。
常用交换器:direct、topic、fanout、headers



快速开始:

yml:
spring:rabbitmq:host: 192.168.64.140username: adminpassword: admin
主程序
@SpringBootApplicationpublic class Main {public static void main(String[] args) {SpringApplication.run(Main.class, args);}@Beanpublic Queue task_queue() {/** 可用以下形式:* new Queue("helloworld") - 持久,非排他,非自动删除* new Queue("helloworld",false,false,false,null)*/return new Queue("helloworld",false); //新建一个helloword队列}}
生产者
AmqpTemplate是rabbitmq客户端API的一个封装工具,提供了简便的方法来执行消息操作.
AmqpTemplate由自动配置类自动创建
@Componentpublic class SimpleSender {@AutowiredAmqpTemplate t;public void send() {// 这里向 helloworld 队列发送消息t.convertAndSend("helloworld", "Hello world!! "+System.currentTimeMillis());System.out.println("消息已发送");}}
消费者
通过@RabbitListener从指定的队列接收消息
使用@RebbitHandler注解的方法来处理消息
@Component@RabbitListener(queues = "helloworld")public class SimpleReceiver {@RabbitHandlerpublic void receive(String msg) {System.out.println("收到: "+msg);}}
这里还可以使用另一种形式:
@Component
public class SimpleReceiver {
@RabbitListener(queues = "helloworld")
public void receive(String msg) {
System.out.println("收到: "+msg);
}
}
另外,@RabbitListener 注解中也可以直接定义队列:
//durable---不持久化
@RabbitListener(queuesToDeclare = @Queue(name = "helloworld",durable = "false"))
六种模式:
简单模式:
创建连接工厂—填写连接消息—通过工厂对象与mq获取连接
工具类
============
发送消息
工作模式:
一个提供者,两个接收者。两个接收者按不严格的“轮询”接收提供者发送的消息,如果某一个接受者处理时间过长,则另一个马上接收消息。

订阅模式:
一个提供者发送消息,多个接收者接收消息。提供者发送消息到指定的交换机,不指定队列,接受者就都能接收到消息。ex1—指定的交换机
路由模式:
一个提供者发送消息,多个接收者接收消息。判断同一个交换机下,以什么开头的消息发送到以指定绑定key值的队列。routing key

二、使用RabbMQ传递对象
- 使用序列化对象 提供者和接收者类的对象的包名,类名,属性名须一致

- 使用序列化字节数组

- 使用json字符串传递

三、基于Java的交换机与队列的创建
springboot中创建:先是创建队列,然后创建交换机,然后绑定交换机和队列,声明一个路由键(routing key)

