SpringBoot整合Rabbitmq

1.pom.xml中引入rabbitmq jar包

XML 复制代码
<!-- mq启动器 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2.application.yaml中添加rabbitmq配置

XML 复制代码
spring
  rabbitmq:
    publisher-confirm-type: correlated
    host: 192.168.1.141
    port: 30001
    username: haha
    password: 1234
    virtual-host: /HAHA
    template:
      retry:
        # 开始重试
        enabled: true
        # 第一次与第二次投递尝试的时间间隔10秒
        initial-interval: 10000ms
        # 尝试的最大时间间隔不超过30秒
        max-interval: 30000ms
        # 上一次尝试时间间隔的乘数2*10000ms
        multiplier: 2
      mandatory: true
    publisher-returns: true
    # 不使用自动确认 改成手动确认
    listener:
      type: simple
      simple:
        #采用手动应答
        acknowledge-mode: manual
		
haha:
  mq:
    # 日志 交换机
    logExchange: haha.shop.log.exchange
    # 日志 成功队列
    logQueue: haha.shop.log.queue
    # 日志 路由键
    logRouteKey: haha.shop.log.route-key
    # 库存明细 交换机
    stockInfoExchange: haha.shop.stock.exchange
    # 库存明细 成功队列
    stockInfoQueue: haha.shop.stock.queue
    # 库存明细 路由键
    stockInfoRouteKey: haha.shop.stock.route-key

3.发送rabbitmq消息

java 复制代码
@Resource
private RabbitTemplate rabbitTemplate;

    @Value("${haha.mq.stockInfoExchange}")
    private String exchange;

    @Value("${haha.mq.stockInfoRouteKey}")
    private String routingKey;

    @Override
    public boolean sendStockInfoMQ(ProductStockInfoReq productStockInfoReq) {
        if (productStockInfoReq != null && productStockInfoReq.getStock() != null) {
            rabbitTemplate.convertAndSend(exchange, routingKey, JSONUtil.toJsonStr(productStockInfoReq));
            return true;
        }
        return false;
    }
	

4.接收rabbitmq消息

java 复制代码
@Slf4j
@Service("stockInfoMqConsumer")
public class StockInfoMqConsumer {
    @Autowired
    private IProductStockInfoService productStockInfoService;

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "${haha.mq.stockInfoQueue}", durable = "true"),
            exchange = @Exchange(name = "${haha.mq.stockInfoExchange}", type = ExchangeTypes.TOPIC),
            key = {"*.shop.stock.route-key"}
    ))
    public void logRecordConsumer(Message message, String content, Channel channel) {
        log.info("店铺库存日志明细消费,消息内容:{}" , content);
        try {
            if (StrUtil.isNotEmpty(content)) {
                ProductStockInfoReq productStockInfoReq = JSONUtil.toBean(content, ProductStockInfoReq.class);
                if (productStockInfoReq.getStoreId() == null) {
                    Integer storeId = productStockInfoService.getStoreIdByStoreId(productStockInfoReq.getStoreId());
                    if (storeId != null) {
                        productStockInfoReq.setStoreId(storeId);
                        // 保存结果数据
                        ProductStockInfo productStockInfo = new ProductStockInfo();
                        BeanUtil.copyProperties(productStockInfoReq, productStockInfo);
                        // 设置时间
                        productStockInfo.setCreateTime(DateUtil.parse(productStockInfoReq.getCreateTimeStr(), DatePattern.NORM_DATETIME_FORMAT));
                        productStockInfo.setBillType(productStockInfoReq.getRemark());
                        boolean save = productStockInfoService.save(productStockInfo);
                        log.info("店铺库存日志明细消费,保存结果:{}" , save);
                        if (save) {
                            //采用手动ack,一条条的消费
                            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                        }
                    } else {
                        log.error("店铺库存日志明细消费,未查找到店铺:{}" , storeId);
                    }
                } else {
                    // 保存结果数据
                    ProductStockInfo productStockInfo = new ProductStockInfo();
                    BeanUtil.copyProperties(productStockInfoReq, productStockInfo);
                    // 设置时间
                    if(StrUtil.isNotEmpty(productStockInfoReq.getCreateTimeStr())){
                        productStockInfo.setCreateTime(DateUtil.parse(productStockInfoReq.getCreateTimeStr(), DatePattern.NORM_DATETIME_FORMAT));
                    }
                    productStockInfo.setBillType(productStockInfoReq.getRemark());
                    boolean save = productStockInfoService.save(productStockInfo);
                    log.info("店铺库存日志明细消费,保存结果:{}" , save);
                    if (save) {
                        //采用手动ack,一条条的消费
                        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
                    }
                }
            } else {
                //采用手动ack,一条条的消费
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
相关推荐
yyueshen几秒前
RabbitMQ系列(一)架构解析
分布式·架构·rabbitmq
吃海鲜的骆驼几秒前
服务异步通讯与RabbitMQ
java·分布式·后端·rabbitmq
m0_748233884 分钟前
RabbitMQ 集群部署方案
分布式·rabbitmq·ruby
m0_7482386311 分钟前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
菜鸟阿达1 小时前
spring boot 2.7 + seata +微服务 降级失败问题修复
spring boot·后端·微服务
張葒兵3 小时前
记一次命令行启动springboot项目的问题 java -jar的问题
java·spring boot·jar
mah66610 小时前
SpringBoot项目连接Oracle视图报错整理
spring boot·后端·oracle
IT学长编程11 小时前
计算机毕业设计 基于SpringBoot的智慧社区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·后端·毕业设计·课程设计·论文笔记·1024程序员节
奋斗的小方11 小时前
Springboot基础篇(3):Bean管理
java·spring boot·后端
扣丁梦想家12 小时前
《Spring Boot + MySQL高性能应用实战:性能优化技巧与最佳实践》
spring boot·后端·mysql