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();
        }
    }
}
相关推荐
佳佳_25 分钟前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
程序媛小果1 小时前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
不能再留遗憾了2 小时前
RabbitMQ 高级特性——消息分发
分布式·rabbitmq·ruby
狂放不羁霸3 小时前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
计算机学长felix4 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
码农派大星。4 小时前
Spring Boot 配置文件
java·spring boot·后端
江深竹静,一苇以航4 小时前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
豪宇刘5 小时前
SpringBoot+Shiro权限管理
java·spring boot·spring
customer086 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea