简介
RabbitMQ 作为一个消息中间件,解耦消息发送与接收。作为消息发送者通过 virtual host 发送到exchange,完成了消息发送。消息队列与exchange 通过 routing key 进行绑定,routing key 把消息路由到绑定的队列。消息的接收端通过监听队列,即可对消息进行消费
消息传递
RabbitMQ 名词
- Server: 也叫做broker ,理解为一台机器
- Virtual host: 虚拟地址,用于逻辑隔离,最上层的消息路由,一个Virtual host里面可以有若干个Exchage和Queue,但同一个Virtual host里面不能有相同名称的Exchage和Queue
- Channel:网络信道,一个网络会话的任务
- Exchange:交换机,接收消息,根据路由键转发消息到绑定队列
- Binding:Exchage和Queue之间的虚拟连接,binding中可以包含routing key
- Routing key:一个路由规则
- Queue:保存具体的消息的容器
exchange 与queue 是多对多的关系,一个交换机可以绑定多个队列,一个对立也可以和多个交换机绑定
Springboot 集成RabbitMQ
实际环境中,消息发送者与接收者,
必须分离
,写博客时候,写在了一块。配置也在一块。步骤如下
- 导入依赖
- 添加配置
- 写代码生产者与消费者
- 测试
依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置文件
spring:
rabbitmq:
host: 192.168.116.131
username: admin
password: admin
virtual-host: /
connection-timeout: 30000 # listener 是消息接收者配置,发送者无需配置
listener:
simple:
concurrency: 3 #并发数
max-concurrency: 5 #最大并发
auto-startup: true #自动开启监听
prefetch: 1 #同一时间处理消息数
acknowledge-mode: manual #签收模式 manual:手动
- 发送者
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendToMsg() {
InfoModel infoModel = new InfoModel().setMessage("this test rbmq").setMsgId("12");
CorrelationData correlationData = new CorrelationData();
correlationData.setId("1");
rabbitTemplate.convertAndSend("t-exchange", "ikang.key", infoModel, correlationData);
System.out.println("发送信息成功=====");
}
- 消息接收者
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value="t-queue",durable = "true",autoDelete = "no"),
exchange = @Exchange(value="t-exchange",durable = "true", type = "topic"),
key="ikang.key"
))
@RabbitHandler
public void receiverMesg(@Payload InfoModel infoModel, @Headers Map<String, Object> header, Channel channel) throws IOException {
System.out.println("接收消息:" + infoModel);
long l = (long) header.get(AmqpHeaders.DELIVERY_TAG);
channel.basicAck(l, false);
}