1、rabbitmq简介
RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言。是面向消息的中间件。
2、架构图
3、优势
- 应用解耦
MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合。
- 异步处理
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
- 削峰填谷
以稳定的系统资源应对突发的流量冲击。
4、官网
5、安装
我是通过docker安装的,具体安装就不介绍了,安装后rabbitmq提供了web可视化页面。
6、实战
pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>springboot-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot-demo</name>
<description>springboot-demo</description>
<properties>
<java.version>1.8</java.version>
<lombok.version>1.18.28</lombok.version>
<hutool-all.version>5.8.21</hutool-all.version>
<fastjson.version>2.0.40</fastjson.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool-all.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
yml配置文件
spring:
application:
name: demo
redis:
host: 81.68.97.33
port: 6380
password: yrw123456
lettuce:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
rabbitmq:
host: 81.68.97.33
port: 5672
username: guest
password: guest
virtual-host: /
#可以监听消息是否从生产者成功传递到交换机
publisher-confirm-type: CORRELATED
#可以监听消息是否从交换机传递到队列
publisher-returns: true
listener:
simple:
#可以监听消费者是否成功处理消息
acknowledge-mode: MANUAL
server:
port: 8080
rabbitmq常量类
package com.example.springbootdemo.constant;
/**
* <p>
* rabbitmq常量类
* </p>
*
* @author yurenwei
* @since 2023/9/6
*/
public interface RabbitmqConstant {
/**
* 交换机名称
*/
String TEST_EXCHANGE_NAME = "test.exchange";
/**
* 队列名称
*/
String TEST_QUEUE_NAME = "test.queue";
/**
* 路由键
*/
String TEST_ROUTING_KEY = "test.routing.key";
}
rabbitmq配置类
package com.example.springbootdemo.config;
import com.example.springbootdemo.constant.RabbitmqConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* <p>
* rabbitmq配置类
* </p>
*
* @author yurenwei
* @since 2023/9/6
*/
@Slf4j
@Configuration
public class RabbitmqConfig {
@Autowired
private ConnectionFactory connectionFactory;
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setConfirmCallback((correlationData, ack, cause) -> {
log.info("【correlationData】:" + correlationData);
log.info("【ack】" + ack);
log.info("【cause】" + cause);
if (ack) {
log.info("【消息从生产者到交换机发送成功】");
} else {
log.info("【消息从生产者到交换机发送失败】correlationData:" + correlationData + " cause:" + cause);
}
});
rabbitTemplate.setMandatory(true);
rabbitTemplate.setReturnCallback((message, replyCode, replyText, exchange, routingKey) -> {
log.warn("【消息从交换机到队列发送失败】");
log.info("【message】" + message);
log.info("【replyCode】" + replyCode);
});
return rabbitTemplate;
}
/**
* 创建交换机
*
* @return Exchange
*/
@Bean("testExChange")
public Exchange testExChange() {
return ExchangeBuilder
.directExchange(RabbitmqConstant.TEST_EXCHANGE_NAME)
.durable(true)
.build();
}
/**
* 创建队列
*
* @return Queue
*/
@Bean("testQueue")
public Queue testQueue() {
return new Queue(RabbitmqConstant.TEST_QUEUE_NAME);
}
/**
* 交换机绑定队列
*
* @param exchange 交换机
* @param queue 对列
* @return Binding
*/
@Bean
public Binding bind(@Qualifier("testExChange") Exchange exchange, @Qualifier("testQueue") Queue queue) {
return BindingBuilder
.bind(queue)
.to(exchange)
.with(RabbitmqConstant.TEST_ROUTING_KEY)
.noargs();
}
}
生产者代码
package com.example.springbootdemo.sevice;
import com.example.springbootdemo.constant.RabbitmqConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* <p>
* rabbitmq接口
* </p>
*
* @author yurenwei
* @since 2023/9/6
*/
@Slf4j
@Service
public class RabbitmqService {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 发送消息
*/
public void sendMessage() {
rabbitTemplate.convertAndSend(RabbitmqConstant.TEST_EXCHANGE_NAME,RabbitmqConstant.TEST_ROUTING_KEY,"测试消息");
}
}
消费者代码
package com.example.springbootdemo.consumer;
import com.example.springbootdemo.constant.RabbitmqConstant;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.time.LocalDateTime;
/**
* <p>
* rabbitmq消费者
* </p>
*
* @author yurenwei
* @since 2023/9/6
*/
@Slf4j
@Component
public class RabbitmqConsumer {
@RabbitListener(queuesToDeclare = @Queue(RabbitmqConstant.TEST_QUEUE_NAME))
public void process(String msg, Channel channel, Message message) {
log.info("【接收消息】{}【当前时间】{}",msg, LocalDateTime.now());
try {
channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
} catch (IOException e) {
e.printStackTrace();
}
}
}
启动项目
项目启动成功后,在rabbitmq可视化页面可以看到配置的交换机,队列及其绑定关系
通过生产者发送消息,监控下消息有没有成功发送,消费者有没有消费
通过控制台测试发现,消息被成功发送和消息。
至此,SpringBoot整合RabbitMQ结束了。