文章目录
前言
提示:本文介绍Springboot集成RabbitMq,以及简单的使用
欢迎关注个人公众号领取学习资料
提示:以下是本篇文章正文内容,下面案例可供参考
一、简单介绍MQ
消息中间件作用:异步操作、系统解耦、流量削峰等,具体使用可根据实际业务场景
常用MQ:Rabbitmq、RocketMQ、Kafka(本文将介绍兔子的使用)
二、安装
1.安装Docker(安装步骤省略,网上很多)
2.Docker安装Rabbitmq
命令如下(示例):
//拉取镜像
docker pull rabbitmq:3.8.0-management
//运行镜像 5672:服务端口 15672:web界面控制端口
docker run -d -p 5672:5672 -p 15672:15672 --name rabbmitq ID
// 进入容器
docker exec -it MQ容器ID bash
//创建用户、设置密码、赋予权限()
rabbitmqctl list_users # 查看全部用户
rabbitmqctl add_user ceshi aaa123 #创建用户、设置密码
rabbitmqctl set_permissions -p / ceshi ".*" ".*" ".*" #权限
rabbitmqctl set_user_tags ceshi administrator #管理员
//退出容器
exit
3.查看是否启动成功http://ip:15672
三、Springboot代码配置
1.yml配置
rabbitmq:
host: 服务器ip
port: 5672
username: ceshi
password: aaa123
#虚拟host 可以不设置,使用server默认host
virtual-host:
2.pom.xml依赖配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3.消息队列枚举
import lombok.Getter;
/**
* @Author: 高彬彬
* @Date: 2022/3/22
* @Description: 消息队列枚举
* @Version: 1.0
*/
@Getter
public enum QueueEnum {
/**
* Demo队列
*/
QUEUE_DEMO("direct-demo", "queue-demo", "key-demo");
/**
* 交换名称
*/
private String exchange;
/**
* 队列名称
*/
private String name;
/**
* 路由键
*/
private String routeKey;
QueueEnum(String exchange, String name, String routeKey) {
this.exchange = exchange;
this.name = name;
this.routeKey = routeKey;
}
}
4.消息队列相关配置
import com.jack.modules.wms.common.enums.QueueEnum;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Author: 高彬彬
* @Date: 2022/3/22
* @Description: 消息队列相关配置
* @Version: 1.0
*/
@Configuration
public class RabbitMqConfig {
/**
* DEMO队列
*/
@Bean
public Queue demoQueue() {
return new Queue(QueueEnum.QUEUE_DEMO.getName(), true);
}
/**
* DEMO交换机
*/
@Bean
DirectExchange demoExchange() {
return new DirectExchange(QueueEnum.QUEUE_DEMO.getExchange());
}
/**
* 将DEMO队列与DEMO交换机绑定,设置匹配routeKey
*/
@Bean
Binding demoBinding() {
return BindingBuilder.bind(demoQueue()).to(demoExchange()).with(QueueEnum.QUEUE_DEMO.getRouteKey());
}
}
四、生产者代码示例
@Autowired
RabbitTemplate rabbitTemplate;
//在对应的业务中调用
rabbitTemplate.convertAndSend(QueueEnum.QUEUE_DEMO.getExchange(), QueueEnum.QUEUE_DEMO.getRouteKey(), "生产者数据DEMO");
五、消费者代码示例
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* @Author: 高彬彬
* @Date: 2022/3/22
* @Description: Demo消费者
* @Version: 1.0
*/
@Component
@RabbitListener(queues = "queue-demo")
public class DemoReceiver {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RabbitHandler
public void process(String msg, @Header(AmqpHeaders.DELIVERY_TAG) long tag, Channel channel) throws IOException {
logger.info("从MQ队列拿到的消息" + msg);
// 确认消息, false表示不会重新放回队列
channel.basicAck(tag, false);
}
}
控制台可查看到从队列拿到的消息,也可以在web管理界面查看消息的消息情况
总结
1、队列的使用可以在一些场景下提升系统的吞吐量,优化用户体验,提升系统的瓶颈等等
2、随之也会带来:系统依赖性、系统问题排查的困难性,如何保证消息的不重复消费,服务器宕机或是网络等问题导致的消息丢失,场景下的消息堆积等等,都是需要进一步解决的
有感
编程之路漫长而道远
正如学如逆水行舟不进则退
编程不仅是一份工作更是属于自己的爱好
知识的积累需要时间来推动