本片主要简单讲一下 springboot 集成rabbitMQ , 消息的简单发布, 消费, 体验rabbitMQ, 话不多说, 我们开始…
准备环境
- jdk 1.8
- maven 3.6.3(idea2019 可能不支持)
- springboot 2.*
- rabbitMQ 3.8.3
- rabbitMQ的环境搭建请参考Centos7安装rabbitMQ
集成背景
场景: 需要记录各大平台的订单记录, 为了以后统计做数据准备,假设,用户在淘宝, 天猫, 京东, 苏宁下单后,将这些订单都扔进rabbitmq, 暂时不考虑流量, 大并发,我们从对应的队列获取订单写入库里;
规则:有这四大品牌标志的归入各自里面, 没有明显标志的,四大品牌都加一单
创建项目
搭建一个springboot 2.3.0 为主的项目集成 rabbitmq
- 搭建项目引入主要依赖spring-boot-starter-amqp
- 在application.yml配置相关配置
- 再次拓展一下springboot 集成rabbitmq 的相关配置说明
# 基础信息
# 默认localhost
spring.rabbitmq.host=192.168.171.113
#端口号
spring.rabbitmq.port=15672
#用户名称
spring.rabbitmq.username=admin
#用户密码
spring.rabbitmq.password=admin
#连接到代理时用的虚拟主机
# spring.rabbitmq.virtual-host
# 客户端应连接到的地址的逗号分隔列表。设置后,主机和端口将被忽略
#spring.rabbitmq.addresses
#请求的心跳超时;无为零。如果未指定持续时间后缀,则将使用秒
#spring.rabbitmq.requested-heartbeat=0
#确认使用的发布者类型
#spring.rabbitmq.publisher-confirm-type=correlated
#是否启用发布者退货
#spring.rabbitmq.publisher-returns=false
#连接超时。将其设置为零以永远等待
#spring.rabbitmq.connection-timeout=0
# SSL 配置
#是否启用SSL支持
#spring.rabbitmq.ssl.enabled=false
#持有SSL证书的密钥库的路径
#spring.rabbitmq.ssl.key-store=
#用于访问密钥库的密码
#spring.rabbitmq.ssl.key-store-password=
#拥有SSL证书的信任库
#spring.rabbitmq.ssl.trust-store=
#用于访问信任库的密码
#spring.rabbitmq.ssl.trust-store-password=
#信任库类型
#spring.rabbitmq.ssl.trust-store-type=JKS
#要使用SSL算法。默认情况下,由Rabbit客户端库配置
#spring.rabbitmq.ssl.algorithm=
#是否启用服务器端证书验证
#spring.rabbitmq.ssl.validate-server-certificate=true
#是否启用主机名验证
#spring.rabbitmq.ssl.verify-hostname=true
# 缓存设置
#要保留在缓存中的通道数。当“检查超时”> 0时,每个连接的最大通道数
#spring.rabbitmq.cache.channel.size=1
#如果已达到高速缓存大小,则等待获取频道的持续时间。如果为0,则始终创建一个新通道
#spring.rabbitmq.cache.channel.checkout-timeout=0
#要缓存的连接数。仅在模式为“连接”时适用
#spring.rabbitmq.cache.connection.size=9
#连接工厂缓存模式
#spring.rabbitmq.cache.connection.mode
# Template模板配置
#是否启用强制性消息
#spring.rabbitmq.template.mandatory=false
#receive()操作超时
#spring.rabbitmq.template.receive-timeout=
#sendAndReceive()操作超时
#spring.rabbitmq.template.reply-timeout=
#是否启用发布重试
#spring.rabbitmq.template.retry.enabled=false
#传递邮件的最大尝试次数
#spring.rabbitmq.template.retry.max-attempts=3
#应用于前一个重试间隔的乘数
#spring.rabbitmq.template.retry.multiplier=1
#两次尝试之间的最大持续时间
#spring.rabbitmq.template.retry.max-interval=10000
#显式指定没有接收消息的默认队列的名称
#spring.rabbitmq.template.default-receive-queue=
#用于发送操作的默认交换的名称
#spring.rabbitmq.template.exchange=
暂时用到的还是几个基础的,如果想了更多的请参考spring官网rabbitMQ相关配置
- 创建相关数据库
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tb_order
-- ----------------------------
DROP TABLE IF EXISTS `tb_order`;
CREATE TABLE `tb_order` (
`order_id` bigint(20) NOT NULL COMMENT '主键',
`order_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单名称',
`order_type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '订单类型',
`order_detail` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '订单详情',
PRIMARY KEY (`order_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`user_id` bigint(20) NOT NULL COMMENT '主键',
`user_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
`user_age` int(4) NULL DEFAULT NULL COMMENT '年龄',
`user_resume` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '履历',
PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
- 引入mybatis 代码生成器
生成相应的mapper.xml, mapper, pojo等
- 至此项目基础已经创建配置完成
代码实战
- 创建rabbitmqConfig 配置类, 配置相关的队列, 交换器,制定绑定规则
/**
* rabbit一些设置 队列 交换器等
* @author :master
* @date :20200611
*/
@Configuration
public class RabbitmqConfig {
/**
* 京东订单
* @return queue
*/
@Bean
public Queue orderJd () {
return new Queue(GlobalConstant.ORDER_JD);
}
/**
* 淘宝订单
* @return queue
*/
@Bean
public Queue orderTb () {
return new Queue(GlobalConstant.ORDER_TB);
}
/**
* 苏宁订单
* @return queue
*/
@Bean
public Queue orderSn () {
return new Queue(GlobalConstant.ORDER_SN);
}
/**
* 天猫订单
* @return queue
*/
@Bean
public Queue orderTm () {
return new Queue(GlobalConstant.ORDER_TM);
}
/**
* 创建交换器
* @return TopicExchange
*/
@Bean
public TopicExchange exchangeWhole () {
return new TopicExchange(GlobalConstant.ORDER_EXCHANGE);
}
/**
* 队列绑定到交换器 规则一 淘宝天猫的
* @param orderTm 队列
* @param exchangeWhole 交换器
* @return 返回binding
*/
@Bean
public Binding bindingTbExchange(Queue orderTm, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderTm).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE1);
}
/**
* 队列绑定到交换器 规则一 淘宝天猫的
* @param orderTm 队列
* @param exchangeWhole 交换器
* @return 返回binding
*/
@Bean
public Binding bindingTbExchange2(Queue orderTm, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderTm).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE2);
}
/**
* 队列绑定到交换器 规则二 淘宝的
* @param orderTb 队列
* @param exchangeWhole 交换器
* @return 返回binding
*/
@Bean
public Binding bindingExchange(Queue orderTb, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderTb).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE1);
}
@Bean
public Binding bindingExchange2(Queue orderTb, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderTb).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE2);
}
/**
* 队列绑定到交换器 规则二 苏宁的
* @param orderSn 队列
* @param exchangeWhole 交换器
* @return 返回binding
*/
@Bean
public Binding bindingSnExchange(Queue orderSn, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderSn).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE3);
}
@Bean
public Binding bindingSnExchange2(Queue orderSn, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderSn).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE2);
}
/**
* 队列绑定到交换器 规则二 京东的
* @param orderJd 队列
* @param exchangeWhole 交换器
* @return 返回binding
*/
@Bean
public Binding bindingJdongExchange(Queue orderJd, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderJd).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE4);
}
@Bean
public Binding bindingJdongExchange2(Queue orderJd, TopicExchange exchangeWhole) {
return BindingBuilder.bind(orderJd).to(exchangeWhole).with(GlobalConstant.EXCHANGE_BINDING_RULE2);
}
/**
* 全局常量
* @author :master
* @date :20200610
*/
public class GlobalConstant {
/**京东 */
public static final String ORDER_JD ="order.lqd.jd";
/**淘宝 */
public static final String ORDER_TB ="order.my.tb";
/**苏宁 */
public static final String ORDER_SN ="order.jm.sn";
/**天猫 */
public static final String ORDER_TM ="order.my.tm";
/** 交换机 */
public static final String ORDER_EXCHANGE = "exchangeWhole";
/** 交换机绑定规则 */
public static final String EXCHANGE_BINDING_RULE1 = "*.my.*";
public static final String EXCHANGE_BINDING_RULE2 = "order.#";
public static final String EXCHANGE_BINDING_RULE3 = "*.lj.*";
public static final String EXCHANGE_BINDING_RULE4 = "*.lqd*";
}
- 创建对应的消费者
/**
* 订单队列监听者
* @author :master
* @date :20200611
*/
@Service
public class OrderListener {
@Autowired
private OrderMapper orderMapper;
/**
* 京东订单处理
* @param order 消息
*/
@RabbitHandler
@RabbitListener(queues = GlobalConstant.ORDER_JD)
public void orderJdDeal (Order order) {
System.out.println(GlobalConstant.ORDER_JD + "====>" + order);
orderMapper.insertSelective(order);
}
/**
* 苏宁订单处理
* @param order 消息
*/
@RabbitHandler
@RabbitListener(queues = GlobalConstant.ORDER_SN)
public void orderSnDeal (Order order) {
System.out.println(GlobalConstant.ORDER_SN + "====>" + order);
orderMapper.insertSelective(order);
}
/**
* 淘宝订单处理
* @param order 消息
*/
@RabbitHandler
@RabbitListener(queues = GlobalConstant.ORDER_TB)
public void orderTbDeal (Order order) {
System.out.println(GlobalConstant.ORDER_TB + "====>" + order);
orderMapper.insertSelective(order);
}
/**
* 天猫订单处理
* @param order 消息
*/
@RabbitHandler
@RabbitListener(queues = GlobalConstant.ORDER_TM)
public void orderTmDeal (Order order) {
System.out.println(GlobalConstant.ORDER_TM + "====>" + order);
orderMapper.insertSelective(order);
}
}
// 提醒一下, 发送类对象需要类实现序列化
/**
* 订单实例
* @author :master
* @date :20200611
*/
@Data
public class Order implements Serializable {
private static final long serialVersionUID = 1L;
private Long orderId;
private String orderName;
private String orderType;
private String orderDetail;
@Override
public String toString() {
return "Order{" +
"orderId=" + orderId +
", orderName='" + orderName + '\'' +
", orderType='" + orderType + '\'' +
", orderDetail='" + orderDetail + '\'' +
'}';
}
}
- 创建生产者
/**
* 订单生成接口
* @author :master
* @date :200200611
*/
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping(value = "/generateOrder", method = RequestMethod.POST)
public String generateOrder(Order order) {
System.out.println("生产者信息:" + order.toString());
rabbitTemplate.convertAndSend(GlobalConstant.ORDER_EXCHANGE, "order.guoMei" ,order);
return "成功";
}
}
- postman测试 调用接口
localhost:8099/order/generateOrder
至此呢, 基本的操作已经完成, 谢谢观赏 奉上代码
springboot集成rabbitmq 基础代码