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();
        }
    }
}
相关推荐
代码的余温20 分钟前
Spring Boot集成Logback日志全攻略
xml·spring boot·logback
没有bug.的程序员27 分钟前
JAVA面试宝典 -《Spring Boot 自动配置魔法解密》
java·spring boot·面试
Bug退退退12339 分钟前
RabbitMQ 之消息积压
分布式·rabbitmq
William一直在路上40 分钟前
SpringBoot 拦截器和过滤器的区别
hive·spring boot·后端
小马爱打代码1 小时前
Spring Boot 3.4 :@Fallback 注解 - 让微服务容错更简单
spring boot·后端·微服务
旷世奇才李先生2 小时前
奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官
spring boot·面试·java-rabbitmq
经典19922 小时前
spring boot 详解以及原理
java·spring boot·后端
白仑色4 小时前
Spring Boot 多环境配置详解
java·spring boot·后端·微服务架构·配置管理
超级小忍4 小时前
在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
java·spring boot·后端
Z_W_H_4 小时前
【springboot】IDEA手动创建SpringBoot简单工程(无插件)
java·spring boot·intellij-idea