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;        // 文件下载路径
}
相关推荐
编程修仙1 小时前
第九篇 异常统一处理
spring boot
学到头秃的suhian1 小时前
Springboot进阶知识
java·spring boot·spring
白宇横流学长1 小时前
基于SpringBoot实现的电子发票管理系统
java·spring boot·后端
白宇横流学长1 小时前
基于SpringBoot实现的智慧就业管理系统
java·spring boot·后端
一只懒鱼a2 小时前
docker搭建rabbit集群
docker·容器·rabbitmq
YDS8292 小时前
SpringCloud —— 黑马商城的项目拆分和Nacos
spring boot·后端·spring cloud
中文很快乐2 小时前
从零到一:用 SpringBoot 打造 RESTful API 实战指南
java·spring boot·后端·restful
2201_757830873 小时前
SpringBoot
java·spring boot·后端
pursue.dreams3 小时前
JavaFX + Spring Boot 桌面应用脚手架:开箱即用的企业级开发框架
spring boot·自动化·javafx
哈哈哈笑什么3 小时前
Spring Boot接口国际化异常信息方案
java·spring boot·后端