当前位置: 首页 > news >正文

Java 生产环境:分片执行、多线程并行异步导入导出、断点续传、失败重试实战全解

目录

一、核心概念与生产选型

1. 核心技术栈(企业标准)

2. 核心设计思路

二、生产级表结构设计(必须)

1. 总任务表 async_task

2. 任务分片表 async_task_slice

三、基础配置:线程池 + 异步

1. 线程池配置(生产关键,避免 OOM / 资源耗尽)

2. 重试机制配置(分片失败自动重试)

四、实战一:并行异步导出(大数据量无 OOM)

流程

1. 统一任务状态枚举

2. 核心:创建任务 + 自动分片

3. 多线程并行执行分片(核心)

五、实战二:并行异步导入(大文件解析)

流程

核心:异步解析 + 分片入库

六、实战三:断点续传 + 失败重试(生产灵魂功能)

1. 断点续传原理

2. 断点续传接口(前端可直接调用)

3. 失败重试机制(生产级)

七、生产环境必须注意的坑(避坑指南)

八、完整架构总结图

九、总结


这是企业级 Java 开发高频核心场景(Excel/CSV 大数据量导入导出),生产环境绝对不能用单线程同步执行,必须解决:

  • 大文件 OOM
  • 接口超时
  • 任务卡死不可恢复
  • 失败全量重来
  • 并发安全 & 数据一致性

本文会用可直接落地生产的方案 + 代码 + 架构设计,完整讲透。

一、核心概念与生产选型

1. 核心技术栈(企业标准)

  • 异步框架:Spring@Async+ 自定义线程池(拒绝使用默认线程池)
  • 文件处理:Alibaba EasyExcel(无内存占用,业界标准)
  • 任务管理:MySQL 任务表 + 分片表(记录进度、状态、分片)
  • 重试机制:Spring Retry / Guava Retrying(异步任务专用)
  • 断点续传:基于分片编号记录成功 / 失败状态,续传只跑失败分片
  • 分片策略:按主键 ID 范围 / 页码 / 时间切分数据,避免重复 / 遗漏

2. 核心设计思路

  1. 任务表:存储总任务(文件名、状态、总条数、成功条数、失败原因)
  2. 分片表:把大任务切成 N 个小分片(独立状态、独立重试)
  3. 异步执行:线程池并行执行分片,不阻塞主线程
  4. 状态实时更新:执行中 / 成功 / 失败 / 暂停,前端可实时查进度
  5. 断点续传:重启服务 / 任务失败,只执行未完成 / 失败分片
  6. 失败重试:分片级重试,不影响其他分片,支持最大重试次数

二、生产级表结构设计(必须)

这是断点续传、失败重试、进度追踪的基础,直接复制到项目使用。

1. 总任务表async_task

CREATE TABLE `async_task` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID', `task_no` varchar(64) NOT NULL COMMENT '任务唯一编号', `task_type` varchar(32) NOT NULL COMMENT '任务类型:IMPORT/EXPORT', `file_name` varchar(255) DEFAULT NULL COMMENT '文件名', `file_url` varchar(512) DEFAULT NULL COMMENT '文件OSS地址', `total` int DEFAULT '0' COMMENT '总数据量', `success` int DEFAULT '0' COMMENT '成功数据量', `fail` int DEFAULT '0' COMMENT '失败数据量', `status` varchar(32) NOT NULL DEFAULT 'WAIT' COMMENT '状态:WAIT/RUNNING/SUCCESS/FAIL/PAUSE', `err_msg` text DEFAULT NULL COMMENT '错误信息', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_task_no` (`task_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异步任务总表';

2. 任务分片表async_task_slice

CREATE TABLE `async_task_slice` ( `id` bigint NOT NULL AUTO_INCREMENT, `task_no` varchar(64) NOT NULL COMMENT '任务编号', `slice_no` int NOT NULL COMMENT '分片编号 1,2,3...', `start_id` bigint NOT NULL COMMENT '起始主键ID', `end_id` bigint NOT NULL COMMENT '结束主键ID', `count` int DEFAULT '0' COMMENT '分片数据量', `status` varchar(32) DEFAULT 'WAIT' COMMENT 'WAIT/RUNNING/SUCCESS/FAIL', `retry_count` int DEFAULT '0' COMMENT '重试次数', `err_msg` text DEFAULT NULL COMMENT '错误信息', `create_time` datetime DEFAULT CURRENT_TIMESTAMP, `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_task_slice` (`task_no`,`slice_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异步任务分片表';

三、基础配置:线程池 + 异步

1. 线程池配置(生产关键,避免 OOM / 资源耗尽)

@Configuration @EnableAsync // 开启异步 public class ThreadPoolConfig { @Bean("asyncTaskExecutor") public Executor asyncTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 核心线程数:根据服务器CPU核心数设置(CPU核心*2 或 服务器配置酌情调整) executor.setCorePoolSize(10); // 最大线程数 executor.setMaxPoolSize(20); // 队列容量 executor.setQueueCapacity(100); // 空闲时间 executor.setKeepAliveSeconds(60); // 线程名前缀(方便日志排查) executor.setThreadNamePrefix("async-task-"); // 拒绝策略:由调用线程处理(避免任务丢失) executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }
http://www.zskr.cn/news/1379056.html

相关文章:

  • 如何5分钟搭建暗黑破坏神2存档编辑器:终极可视化解决方案指南
  • Revit浮点许可调度,三种思路对应三个规模的设计院
  • 大连6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 终极指南:用D2DX让经典《暗黑破坏神2》在现代电脑上焕发新生
  • SecureCRT 9.1.0不止是SSH客户端:挖掘你可能不知道的5个高效工作流技巧
  • 模型越强,Bug越隐?DeepSeek代码生成评测:12个真实项目踩坑案例,速查避雷清单
  • 六安6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 2026桂林防水避坑测评!深挖喀斯特地貌漏水难题,甄选靠谱补漏品牌 - 资讯焦点
  • 鞍山6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 终极空洞骑士模组管理器 Lumafly:跨平台一键安装与智能依赖管理指南
  • 二刷hot100-114.二叉树展开为链表
  • 快速无损转换B站缓存视频:m4s-converter终极使用指南
  • 低噪声前级放大器设计:低阻抗与多放大器并联技术解析
  • 开源信号分析仪上位机软件重构:多线程架构、触发系统与性能优化实践
  • 南平6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 智能激活革命:如何用KMS_VL_ALL_AIO三分钟搞定Windows与Office激活难题
  • 马鞍山6月雨季来临,房屋漏水怎么办?卫生间免砸砖防水、外墙、屋面+地下室渗漏。权威防水公司靠谱TOP5推荐(2026年6月本地最新深度调研) - 企业资讯
  • 江苏省丹阳寄快递省钱攻略|本地人私藏靠谱低价寄件渠道,跨省寄件轻松省下一笔钱 - 时讯资讯
  • 2026惠州防水深度测评!破解沿海湿热漏水通病,四大卫生间补漏品牌甄选 - 资讯焦点
  • DeepSeek文档自动化落地真相(企业级私有化部署实测报告):92.6%准确率背后的4类元数据校验机制
  • 【DeepSeek幻觉治理白皮书】:20年AI系统稳定性专家亲授5类幻觉根因与实时拦截方案
  • 有刷直流电机无传感器稳速:EMF反馈与RI补偿电路实战解析
  • KMS_VL_ALL_AIO终极指南:如何一键永久激活Windows和Office全系列
  • 北京公司注册找谁家?2026最新梯队推荐 + 避坑指南 - 博客湾
  • Proteus例程导入方法
  • 扩散模型diffusion
  • 终极免费音乐解锁工具:如何一键解密QQ音乐、网易云音乐的加密文件
  • 三步搞定:让你的小爱音箱秒变AI语音助手终极指南
  • 终极GitHub访问优化指南:一键解决网络瓶颈的完整方案
  • Java 第七章第八章 案例教程