-
引入依赖
-
RabbitMQ 基础配置
-
RabbitMQ 配置类
-
发送异步导出任务
-
消费者监听任务
-
任务实体类结构说明
-
引入 RabbitMQ 依赖
在 pom.xml 中添加 Spring Boot AMQP 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
此依赖包含 RabbitTemplate、@RabbitListener 等核心功能。
配置文件(application.yml)
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 配置类
@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();
}
}
发送异步导出任务(生产者)
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();
}
消费者(监听导出任务)
@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 实体类
@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; // 文件下载路径
}
142

被折叠的 条评论
为什么被折叠?



