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;        // 文件下载路径
}
相关推荐
㳺三才人子38 分钟前
初探 Spring Framework OncePerRequestFilter
spring boot·spring·junit
这是程序猿1 小时前
基于java的ssm框架学生作业管理系统
java·开发语言·spring boot·spring·学生作业管理系统
源码获取_wx:Fegn08952 小时前
基于springboot + vue小区人脸识别门禁系统
java·开发语言·vue.js·spring boot·后端·spring
Ahtacca4 小时前
Linux环境下前后端分离项目(Spring Boot + Vue)手动部署全流程指南
linux·运维·服务器·vue.js·spring boot·笔记
AC赳赳老秦4 小时前
政务数据处理:DeepSeek 适配国产化环境的统计分析与报告生成
开发语言·hadoop·spring boot·postgresql·测试用例·政务·deepseek
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue小区人脸识别门禁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
让我上个超影吧7 小时前
基于SpringBoot和Vue实现CAS单点登录
前端·vue.js·spring boot
利刃大大8 小时前
【SpringBoot】validation参数校验 && JWT鉴权实现 && 加密/加盐
java·spring boot·jwt·加密
quweiie8 小时前
centOS stream 9 安装rabbitMQ4.2
centos·rabbitmq