Spring Boot + RabbitMQ 实现导出任务异步处理

  1. 引入依赖

  2. RabbitMQ 基础配置

  3. RabbitMQ 配置类

  4. 发送异步导出任务

  5. 消费者监听任务

  6. 任务实体类结构说明

  7. 引入 RabbitMQ 依赖

在 pom.xml 中添加 Spring Boot AMQP 依赖:

java 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

此依赖包含 RabbitTemplate、@RabbitListener 等核心功能。

配置文件(application.yml)

javascript 复制代码
spring:
  data:
    rabbitmq:
      # RabbitMQ 服务器地址
      host: ${RABBITMQ_HOST:192.168.1.1}

      # 端口
      port: ${RABBITMQ_PORT:6672}

      # 用户名、密码
      username: ${RABBITMQ_USERNAME:root}
      password: ${RABBITMQ_PASSWORD:123456}

      # 虚拟机(推荐按项目隔离)
      virtual-host: ${RABBITMQ_VIRTUAL:/project}

      listener:
        type: simple
        simple:
          retry:
            enabled: true       # 开启消费失败重试
            max-attempts: 3     # 最大重试次数(含首次)
          default-requeue-rejected: true  # 超过重试后是否重新入队
          auto-startup: true    # 项目启动时自动开启监听

RabbitMQ 配置类

java 复制代码
@Configuration
public class RabbitConfig {

    /**
     * 创建 Topic 类型交换机
     */
    @Bean
    public Exchange exchange() {
        return ExchangeBuilder.topicExchange("exchange").durable(true).build();
    }

    /**
     * 创建 JSON 消息转换器(对象自动转 JSON)
     */
    @Bean
    public Jackson2JsonMessageConverter jsonMessageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

发送异步导出任务(生产者)

java 复制代码
public AjaxResult exportBranchClearingRatio(BranchClearingRatioQueryReq queryReq) {

    // 构建导出任务
    ReportTask task = ReportTask.builder()
            .taskCode(ReportTaskEnum.EXPORT_BRANCH_CLEARING_RATIO.getCode())
            .taskType(ReportTaskType.EXPORT.getValue())
            .taskStatus(ReportTaskStatus.HANDLEING.getValue())
            .taskName(ReportTaskEnum.EXPORT_BRANCH_CLEARING_RATIO.getDesc())
            .requestUrl("")
            .taskKey(ReportTaskEnum.EXPORT_BRANCH_CLEARING_RATIO.getKey())
            .paramJson(JSONUtil.toJsonStr(queryReq))
            .build();

    // 保存任务记录
    boolean save = reportTaskService.save(task);
    Assert.isTrue(save, () -> new RuntimeException("导出任务失败, 请稍后重试"));

    // 封装 MQ 消息
    ExportTask exportTask = new ExportTask();
    exportTask.setTaskId(task.getId());
    exportTask.setExportType(ReportTaskEnum.EXPORT_BRANCH_CLEARING_RATIO.getCode());

    // 发送到交换机
    rabbitTemplate.convertAndSend("exchange", "topic.excelExportTask", exportTask);

    return AjaxResult.ok();
}

消费者(监听导出任务)

java 复制代码
@Component
@RabbitListener(queues = "EXCEL_EXPORT_TASK")
@RequiredArgsConstructor(onConstructor_ = {@Lazy})
public class ExportTaskReceive {

    private final ExportTaskConsumer excelExportTaskInvoice;

    @RabbitHandler
    public void handle(ExportTask exportTask){
        try {
            excelExportTaskInvoice.handleData(exportTask);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ReportTask 实体类

java 复制代码
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@Builder
@TableName("t_report_task")
public class ReportTask extends BaseEntity implements Serializable {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;

    private String taskCode;       // 任务编号
    private Integer taskType;      // 1-导出;2-导入
    private Integer taskStatus;    // 任务状态:处理中/成功/失败
    private String taskName;       // 任务名称
    private String requestUrl;     // 对应接口路径
    private String taskKey;        // 队列路由 key
    private String paramJson;      // 请求参数 JSON
    private String errorMsg;       // 错误信息
    private String fileUrl;        // 文件下载路径
}
相关推荐
毕设源码-朱学姐5 分钟前
【开题答辩全过程】以 基于SpringBoot的律师事务所管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 基于springboot的日用药品仓库管理系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
+VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue酒店预订系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
小北方城市网5 小时前
MySQL 索引优化实战:从慢查询到高性能
数据库·spring boot·后端·mysql·rabbitmq·mybatis·java-rabbitmq
Chan165 小时前
《Java并发编程的艺术》| 并发关键字与 JMM 核心规则
java·开发语言·数据库·spring boot·java-ee·intellij-idea·juc
汤姆yu5 小时前
基于springboot的植物花卉销售管理系统
java·spring boot·后端
不想写bug呀6 小时前
RabbitMQ相关问题(1)
java·rabbitmq
海南java第二人6 小时前
Spring Boot Starters深度解析:简化依赖管理的核心利器
java·spring boot·后端
韩立学长6 小时前
Springboot喵趣网上宠物店的设计和实现5pidz60b(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
让我上个超影吧6 小时前
天机学堂——播放进度方案优化
java·spring boot·redis·spring cloud