springboot 集成 rabbitMQ 实例之rabbitMQ集成

springboot 集成 rabbitMQ 实例之rabbitMQ集成


本片主要简单讲一下 springboot 集成rabbitMQ , 消息的简单发布, 消费, 体验rabbitMQ, 话不多说, 我们开始…

准备环境

  1. jdk 1.8
  2. maven 3.6.3(idea2019 可能不支持)
  3. springboot 2.*
  4. rabbitMQ 3.8.3
  5. rabbitMQ的环境搭建请参考Centos7安装rabbitMQ

集成背景

场景: 需要记录各大平台的订单记录, 为了以后统计做数据准备,假设,用户在淘宝, 天猫, 京东, 苏宁下单后,将这些订单都扔进rabbitmq, 暂时不考虑流量, 大并发,我们从对应的队列获取订单写入库里;

规则:有这四大品牌标志的归入各自里面, 没有明显标志的,四大品牌都加一单

创建项目

搭建一个springboot 2.3.0 为主的项目集成 rabbitmq

  1. 搭建项目引入主要依赖spring-boot-starter-amqp在这里插入图片描述
  2. 在application.yml配置相关配置在这里插入图片描述
  3. 再次拓展一下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相关配置

  1. 创建相关数据库
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;
  1. 引入mybatis 代码生成器
    在这里插入图片描述
    生成相应的mapper.xml, mapper, pojo等在这里插入图片描述
    在这里插入图片描述
  2. 至此项目基础已经创建配置完成
    在这里插入图片描述

代码实战

  1. 创建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*";
}
  1. 创建对应的消费者
/**
 * 订单队列监听者
 * @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 + '\'' +
                '}';
    }
}
  1. 创建生产者
/**
 * 订单生成接口
 * @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 "成功";
    }
    
}
  1. postman测试 调用接口
localhost:8099/order/generateOrder

在这里插入图片描述
在这里插入图片描述

至此呢, 基本的操作已经完成, 谢谢观赏 奉上代码
springboot集成rabbitmq 基础代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值