From 7be9bda298adce0e822a31430fcf4e2ae5ee1dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=91=E5=B9=B4=E6=A2=A6=E4=B8=8E=E7=A0=96?= <2847127106@qq.com> Date: Sun, 8 Sep 2024 10:02:46 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4,=E6=96=B0=E5=A2=9E=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E7=BA=BF=E7=A8=8B=E6=B1=A0=E5=A4=A7=E5=B0=8F,?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E7=BA=BF=E7=A8=8B=E5=88=86=E9=85=8D=E6=9D=A1?= =?UTF-8?q?=E6=95=B0=E5=88=92=E5=88=86=E5=92=8C=E7=BA=BF=E7=A8=8B=E6=B1=A0?= =?UTF-8?q?=E9=87=8D=E5=BB=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/muyu/quest/manager/TaskManager.java | 10 +++++++- .../quest/service/impl/TaskServiceImpl.java | 25 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/muyu-quest-server/src/main/java/com/muyu/quest/manager/TaskManager.java b/muyu-quest-server/src/main/java/com/muyu/quest/manager/TaskManager.java index ce94427..bfa7a0a 100644 --- a/muyu-quest-server/src/main/java/com/muyu/quest/manager/TaskManager.java +++ b/muyu-quest-server/src/main/java/com/muyu/quest/manager/TaskManager.java @@ -23,7 +23,7 @@ import java.util.List; public final class TaskManager { // 线程池中默认线程的个数为5 - private static int workerNum = 8; + private static int workerNum = 5; // 工作线程 private final WorkThread[] workThrads; // 未处理的任务 @@ -113,6 +113,14 @@ public final class TaskManager { return taskQueue.size(); } + /** + * 返回线程池当前状态 + * @return 如果还在工作返回false,否则返回true + */ + public Boolean getIsRunning() { + return taskQueue.isEmpty() || (taskManager.getWaitTasknumber() == 0 && taskManager.getWorkThreadNumber() == 0); + } + // 覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数 @Override public String toString() { diff --git a/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java b/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java index 22c1a52..8da1dcf 100644 --- a/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java +++ b/muyu-quest-server/src/main/java/com/muyu/quest/service/impl/TaskServiceImpl.java @@ -50,7 +50,7 @@ public class TaskServiceImpl extends ServiceImpl @Resource private ITaskExportService taskExportService; - private final static TaskManager taskManager = TaskManager.getTaskManager(); + private static TaskManager taskManager = null; /** * 查询任务 @@ -154,17 +154,34 @@ public class TaskServiceImpl extends ServiceImpl String findSql = getFindSql(nodeMap); // 获取查询条数 int count = getFindCount(findSql, nodeMap); - // 划分线程 每次查询100000条 - int pageSize = 100000; + // 划分线程 每次根据条数分配线程每次查询条数 + // 1000W 5/100000 100W 8/10000 10W 8/1000 + int pageSize = count / 100; + int taskNum = 8; + if (count > 100000000){ + pageSize = 100000; + taskNum = 5; + }else if (count > 10000000){ + pageSize = 10000; + }else if (count < 100000){ + pageSize = 1000; + } int threadNum = count / pageSize + 1; log.info("任务 {} 总共需要 {} 条数据, 划分为线程{}条",taskCode,count,threadNum); + if (taskManager == null){ + taskManager = TaskManager.getTaskManager(taskNum); + }else if (taskManager.getIsRunning()){ + taskManager.destroy(); + taskManager = TaskManager.getTaskManager(taskNum); + } for (int i = 0; i < threadNum; i++) { int index = i+1; + int limitNum = pageSize; // 添加进入任务队列 taskManager.execute(() -> { String exportCode = UUID.randomUUID().toString().replace("-",""); // 获取新SQL 并执行 - String sql = findSql + " LIMIT "+pageSize+" OFFSET "+(index-1)*pageSize; + String sql = findSql + " LIMIT "+limitNum+" OFFSET "+(index-1)*limitNum; String addSql = getAddSql(nodeMap, sql); int addSqlMaxLength = Math.min(addSql.length(), 30000); TaskExport entity = new TaskExport(taskCode,exportCode, addSql.substring(0,addSqlMaxLength), 0, "");