1.概念
- 消息发送者(publisher):生产消息
- 交换机(exchange):负责路由消息,把消息路由给队列,可以路由给一个队列,也可以路由给多个队列,这取决于交换机的类型
- 队列(queue):队列,存储消息
- 消息消费者(coumsmser):消费消息
- 虚拟主机(virtual-host):虚拟主机,数据隔离作用
2.数据隔离
在实际工作中,公司一般是在一个指定的服务器上去搭建mq,或者多个机器上去搭建集群模式,那一个公司肯定不止一个项目组,多个项目组的情况下,不可能每个项目都搞一套自己的mq,费时费力不说,维护还麻烦,所以mq就有数据隔离,多个项目组用一个环境的mq,数据不一样而已
3.使用控制台向mq传递消息
1.创建两个队列-“测试队列”,“测试队列2”
2.创建一个交换机-“测试交换机”
3.测试发送消息
3.1让交换机和队列进行绑定
绑定成功之后在指定的"测试队列"中也可以看到他和交换机的绑定关系
3.2发送消息
3.3查看消息
当然你也可以使用这个交换机同时绑定创建的两个队列
4.创建虚拟主机
5.java使用rabbitmq
5.1 发送消息
接着之前的在common里面引入依赖(没看之前的文章的直接就创建一个单体的springboot项目引入这个依赖就行)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
在用户工程作为消息投递方,订单工程作为消费者,不通过交换机投递消息,并且消费
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
userController
@Autowired
RabbitTemplate rabbitTemplate;
@GetMapping("/sendMassage")
@ApiOperation(value = "不通过交换机发送消息")
public void sendMassage( String queueName ,String msg ){
rabbitTemplate.convertAndSend(queueName,msg);
}
接口测试
查看消息
5.2 消费消息
order工程加配置
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
创建orderListen
@Component
public class orderListen {
@RabbitListener(queues = "测试队列2")
public void listenOrder(String msg){
System.out.println("我已经接收到订单消息:"+msg);
}
}
6.任务模型work queues
简单的说就是多个消费者绑定一个队列
- 创建一个队列work.queue
- 生产者(用户服务)向队列(work.queue)中发送消息,每秒钟100条记录
- 创建两个消费者(订单服务)监听队列,一个消费者一秒钟消费20条,一个消费者一秒钟消费30条记录
生产者代码
@GetMapping("/sendWorkQueueMassage")
@ApiOperation(value = "发送到任务模型")
public void sendWorkQueueMassage() throws InterruptedException {
String queueName="work.queue";
for (int i = 1; i <=100 ; i++) {
String msg="msg_"+i;
rabbitTemplate.convertAndSend(queueName,msg);
//休眠20毫秒
Thread.sleep(20);
}
}
消费者代码
@RabbitListener(queues = "work.queue")
public void listenWorkQueueOrder(String msg) throws InterruptedException {
System.out.println("消费者1已经接收到订单消息:"+msg);
// Thread.sleep(30);
}
@RabbitListener(queues = "work.queue")
public void listenWorkQueueOrder2(String msg) throws InterruptedException {
System.err.println("消费者2已经接收到订单消息:"+msg);
// Thread.sleep(40);
}
结果:
1.队列在被多个消费者绑定的时候,队列会把消息轮询分配给每一个消费者
2.消息被消费