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;        // 文件下载路径
}
相关推荐
Sam_Deep_Thinking13 小时前
Spring Boot 的启动原理是什么?
java·spring boot·后端
屋外雨大,惊蛰出没13 小时前
深入浅出Spring Boot
java·spring boot·ioc·aop
协享科技14 小时前
Spring Boot 与 Go 双服务架构实践:从单体拆分到通信设计
java·人工智能·spring boot·后端·架构·golang·ai编程
小林敲代码778816 小时前
记录一下IDEA中很多变量变色的方案
java·开发语言·spring boot·idea
半夜修仙16 小时前
RabbitMQ中如何保证消息的可靠性传输
java·分布式·中间件·rabbitmq·github·java-rabbitmq
Flittly16 小时前
【AgentScope Java新手村系列】(3)工具系统
java·spring boot·spring
Flittly17 小时前
【AgentScope Java新手村系列】(2)第一个Agent-基础对话
java·spring boot·spring·ai
小二·17 小时前
Spring Boot 3 + Vue 3 全栈开发实战
vue.js·spring boot·后端
码农飞哥18 小时前
Spring Boot 多角色权限隔离实战:接口层+路由层+UI层三层防御,杜绝生产数据泄露
spring boot·状态模式·架构设计·系统设计·权限控制
SuperArc199918 小时前
SpringBoot+Slf4j+Log4j2+mybatis 日志整合
spring boot·mybatis·log4j2·slf4j·日志整合