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();
        }
    }
}
相关推荐
ZhengEnCi3 小时前
S02-SpringBoot实体类新增字段对已有数据的影响及自动DDL同步机制详解
数据库·spring boot
程序员张33 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端
952364 小时前
RabbitMQ-基础操作
java·spring boot·分布式·后端·spring·rabbitmq
卓怡学长5 小时前
w266基于spring boot + vue 圣地延安美食乐享系统
java·数据库·vue.js·spring boot·spring·intellij-idea
Listen·Rain7 小时前
Springboot整合Ollama实现调用本地多模型
java·spring boot·后端
宠友信息7 小时前
多端即时通讯源码技术实践,Redis路由、MySQL持久化与Socket接入
spring boot·websocket·mysql·uni-app
Tom·Ge8 小时前
【Spring Boot 4】Spring Boot 4.0 AI Agent实战:Skills Agent + MCP协议集成
人工智能·spring boot·microsoft
Devin~Y8 小时前
电商场景下的Java面试实战:从Spring Boot微服务到Kafka、Redis与AI RAG
java·spring boot·redis·elasticsearch·spring cloud·微服务·kafka
白露与泡影9 小时前
用 Spring Boot + Vue + Fuzio 构建现代 Java 桌面应用
java·vue.js·spring boot
宠友信息10 小时前
Spring Boot与异步审核构建仿小红书源码内容发布全流程
java·数据库·spring boot·redis·mysql·oracle·uni-app