Browse Source

优化系统线程结构

lwx_dev
erdanergou 3 years ago
parent
commit
c2e9dc2a88
  1. 18
      src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java
  2. 8
      src/main/java/com/dreamchaser/depository_manage/security/pool/SendQyWxMessageThreadPool.java
  3. 18
      src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java
  4. 29
      src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java
  5. 211
      src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java
  6. 42
      src/test/java/com/dreamchaser/depository_manage/OtherTest.java

18
src/main/java/com/dreamchaser/depository_manage/security/pool/HandlesOtherFunctionalThreadPool.java

@ -1,21 +1,29 @@
package com.dreamchaser.depository_manage.security.pool; package com.dreamchaser.depository_manage.security.pool;
import java.util.concurrent.ExecutorService; import java.util.concurrent.*;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/** /**
* 定义用于处理其他需要开启线程功能的线程池 * 定义用于处理其他需要开启线程功能的线程池
*/ */
public class HandlesOtherFunctionalThreadPool { public class HandlesOtherFunctionalThreadPool {
public static ExecutorService exs = new ThreadPoolExecutor(20, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
// 设置核心线程数为cpu的数量
static int corePoolSize = Runtime.getRuntime().availableProcessors();
// 设置最大线程数为cpu数的2倍
static int maximumPoolSize = corePoolSize * 2;
static int keepAliveTime = 100;
public static ExecutorService exs = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),new ThreadPoolExecutor.CallerRunsPolicy());
// 用于执行对应的方法 // 用于执行对应的方法
public static void execute(Runnable runnable){ public static void execute(Runnable runnable){
exs.execute(runnable); exs.execute(runnable);
} }
// 用于关闭线程池
public static void close(){ public static void close(){
exs.shutdown(); // 禁止提交新任务 exs.shutdown(); // 禁止提交新任务
// 设定最大重试次数 // 设定最大重试次数

8
src/main/java/com/dreamchaser/depository_manage/security/pool/SendQyWxMessageThreadPool.java

@ -6,7 +6,13 @@ import java.util.concurrent.*;
* 定义用于发送企业微信相关信息的线程池 * 定义用于发送企业微信相关信息的线程池
*/ */
public class SendQyWxMessageThreadPool { public class SendQyWxMessageThreadPool {
public static ExecutorService exs = new ThreadPoolExecutor(10, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); // 设置核心线程数为cpu的数量
static int corePoolSize = Runtime.getRuntime().availableProcessors();
// 设置最大线程数为cpu数的2倍
static int maximumPoolSize = corePoolSize * 2;
static int keepAliveTime = 100;
public static ExecutorService exs = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),new ThreadPoolExecutor.CallerRunsPolicy());
// 用于执行对应的方法 // 用于执行对应的方法
public static void execute(Runnable runnable){ public static void execute(Runnable runnable){

18
src/main/java/com/dreamchaser/depository_manage/service/MaterialService.java

@ -232,24 +232,6 @@ public interface MaterialService {
*/ */
Integer updateStateByTypeId(Map<String,Object> map); Integer updateStateByTypeId(Map<String,Object> map);
/**
* 构造树形选择框(部门)
* @return
*/
List<Object> InitTreeMenus(String mname,String adminorg);
/**
* 构造树形选择框(盘点)
* @return
*/
List<Object> InitTreeMenus(String mname,String depositoryId,String placeId);
/**
* 构造树形选择框
* @return
*/
List<Object> InitTreeMenus(String mname);
/** /**
* 构造树形选择框(测试) * 构造树形选择框(测试)
* @return * @return

29
src/main/java/com/dreamchaser/depository_manage/service/impl/ExcelServiceImpl.java

@ -112,11 +112,17 @@ public class ExcelServiceImpl implements ExcelService {
// 定义线程数 // 定义线程数
int threadSize = (int) Math.ceil(totalVal / size); int threadSize = (int) Math.ceil(totalVal / size);
// 定义最大线程数
int maxThreadSize = Runtime.getRuntime().availableProcessors();
if (threadSize > maxThreadSize) {
double temp = threadSize - maxThreadSize;
maxThreadSize =(int)(Math.ceil(temp / maxThreadSize) * maxThreadSize);
}
// 定义开启线程数目 // 定义开启线程数目
int openThreadSize = 0; int openThreadSize = 0;
// 开启对应数量的线程 // 开启对应数量的线程
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize)); ExecutorService exs = new ThreadPoolExecutor(threadSize, maxThreadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(maxThreadSize));
// 线程结果集 // 线程结果集
List<Future<List<String>>> futureList = new ArrayList<Future<List<String>>>(); List<Future<List<String>>> futureList = new ArrayList<Future<List<String>>>();
@ -161,7 +167,7 @@ public class ExcelServiceImpl implements ExcelService {
} }
} }
List<ExcelInfoForMaterial> userExcelMaterialInfo = ExcelFileInfoPool.getUserExcelMaterialInfo(userByPort.getNumber()); List<ExcelInfoForMaterial> userExcelMaterialInfo = ExcelFileInfoPool.getUserExcelMaterialInfo(userByPort.getNumber());
if(userExcelMaterialInfo == null){ if (userExcelMaterialInfo == null) {
userExcelMaterialInfo = new ArrayList<>(); userExcelMaterialInfo = new ArrayList<>();
} }
readResult.put("dataList", userExcelMaterialInfo); readResult.put("dataList", userExcelMaterialInfo);
@ -275,7 +281,7 @@ public class ExcelServiceImpl implements ExcelService {
} }
List<ExcelInfoByMT> userExcelMaterialTypeInfo = ExcelFileInfoPool.getUserExcelMaterialTypeInfo(userByPort.getNumber()); List<ExcelInfoByMT> userExcelMaterialTypeInfo = ExcelFileInfoPool.getUserExcelMaterialTypeInfo(userByPort.getNumber());
if(userExcelMaterialTypeInfo == null){ if (userExcelMaterialTypeInfo == null) {
userExcelMaterialTypeInfo = new ArrayList<>(); userExcelMaterialTypeInfo = new ArrayList<>();
} }
@ -394,7 +400,7 @@ public class ExcelServiceImpl implements ExcelService {
List<ExcelInfoByInventory> userExcelInventoryInfo = ExcelFileInfoPool.getUserExcelInventoryInfo(userByPort.getNumber()); List<ExcelInfoByInventory> userExcelInventoryInfo = ExcelFileInfoPool.getUserExcelInventoryInfo(userByPort.getNumber());
if(userExcelInventoryInfo == null){ if (userExcelInventoryInfo == null) {
userExcelInventoryInfo = new ArrayList<>(); userExcelInventoryInfo = new ArrayList<>();
} }
readResult.put("dataList", userExcelInventoryInfo); readResult.put("dataList", userExcelInventoryInfo);
@ -413,11 +419,10 @@ public class ExcelServiceImpl implements ExcelService {
* 用于出库订单填充 * 用于出库订单填充
* *
* @param id 待打印出库订单id * @param id 待打印出库订单id
* @param pageSize 一张最多打印条数 * @param pageSize 一张最多打印条数
*/ */
@Override @Override
public List<String> writeExcelForPrint(Integer id, Integer pageSize,UserByPort userToken,String userKey,String token) { public List<String> writeExcelForPrint(Integer id, Integer pageSize, UserByPort userToken, String userKey, String token) {
// 生成的表格名称列表 // 生成的表格名称列表
List<String> fileNameList = new ArrayList<>(); List<String> fileNameList = new ArrayList<>();
@ -452,7 +457,7 @@ public class ExcelServiceImpl implements ExcelService {
// 设置单号 // 设置单号
excelInfoByWrite.setCode(record.getCode()); excelInfoByWrite.setCode(record.getCode());
// 获取当前出库单申请人 // 获取当前出库单申请人
UserByPort applicanter = LinkInterfaceUtil.FindUserById(record.getApplicantId(), userKey,token); UserByPort applicanter = LinkInterfaceUtil.FindUserById(record.getApplicantId(), userKey, token);
// 设置申请人名称 // 设置申请人名称
excelInfoByWrite.setApplicantName(applicanter.getName()); excelInfoByWrite.setApplicantName(applicanter.getName());
// 获取施工单位Id // 获取施工单位Id
@ -473,7 +478,7 @@ public class ExcelServiceImpl implements ExcelService {
if ("".equals(s)) { if ("".equals(s)) {
continue; continue;
} }
UserByPort checker = LinkInterfaceUtil.FindUserById(ObjectFormatUtil.toInteger(s), userKey,token); UserByPort checker = LinkInterfaceUtil.FindUserById(ObjectFormatUtil.toInteger(s), userKey, token);
sb.append(checker.getName()); sb.append(checker.getName());
} }
// 设置审核人名称 // 设置审核人名称
@ -487,7 +492,7 @@ public class ExcelServiceImpl implements ExcelService {
Integer adminorgId = record.getAdminorgId(); Integer adminorgId = record.getAdminorgId();
if (adminorgId != null) { if (adminorgId != null) {
Administration company = LinkInterfaceUtil.getCompany(adminorgId, userKey,token); Administration company = LinkInterfaceUtil.getCompany(adminorgId, userKey, token);
// 设置部门名称 // 设置部门名称
excelInfoByWrite.setAdminorgName(company.getName()); excelInfoByWrite.setAdminorgName(company.getName());
} else { } else {
@ -712,7 +717,7 @@ public class ExcelServiceImpl implements ExcelService {
} }
} }
ExcelFileInfoPool.removeUserExcelInventoryInfo(number); ExcelFileInfoPool.removeUserExcelInventoryInfo(number);
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForInventory)+";导入人员"+userByPort.getName()+":"+userByPort.getNumber()); log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForInventory) + ";导入人员" + userByPort.getName() + ":" + userByPort.getNumber());
} }
@ -752,7 +757,7 @@ public class ExcelServiceImpl implements ExcelService {
} }
ExcelFileInfoPool.removeUserExcelMaterialTypeInfo(number); ExcelFileInfoPool.removeUserExcelMaterialTypeInfo(number);
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterialType)+";导入人员"+userByPort.getName()+":"+userByPort.getNumber()); log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterialType) + ";导入人员" + userByPort.getName() + ":" + userByPort.getNumber());
} }
@ -796,7 +801,7 @@ public class ExcelServiceImpl implements ExcelService {
} }
} }
ExcelFileInfoPool.removeUserExcelMaterialInfo(number); ExcelFileInfoPool.removeUserExcelMaterialInfo(number);
log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterial)+";导入人员"+userByPort.getName()+":"+userByPort.getNumber()); log.info("【批量添加】批量添加数据:{}", JSON.toJSONString(excelVosForMaterial) + ";导入人员" + userByPort.getName() + ":" + userByPort.getNumber());
} }

211
src/main/java/com/dreamchaser/depository_manage/service/impl/MaterialServiceImpl.java

@ -1950,128 +1950,6 @@ public class MaterialServiceImpl implements MaterialService {
return children; return children;
} }
/**
* 构造树形选择框
*
* @return
*/
public List<Object> InitTreeMenus(String mname, String adminorg) {
// 获取所有顶级类别
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 开启对应数量的线程
int threadSize = materialTypeNoParent.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType materialType = materialTypeNoParent.get(i);
Future<Object> future = completionService.submit(new Task(materialType, mname, adminorg));
futureList.add(future);
}
// 3.获取结果
for (int i = 0; i < materialTypeNoParent.size(); i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
/**
* 构造树形选择框(盘点)
*
* @return
*/
@Override
public List<Object> InitTreeMenus(String mname, String depositoryId, String placeId) {
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 开启对应数量的线程
int threadSize = materialTypeNoParent.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType materialType = materialTypeNoParent.get(i);
Future<Object> future = completionService.submit(new TaskForTaking(materialType, mname, depositoryId, placeId));
futureList.add(future);
}
// 3.获取结果
for (int i = 0; i < materialTypeNoParent.size(); i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
/**
* 构造树形选择框普通
*
* @return
*/
public List<Object> InitTreeMenus(String mname) {
List<MaterialType> materialTypeNoParent = materialTypeMapper.findMaterialTypeNoParent();
// 开启对应数量的线程
int threadSize = materialTypeNoParent.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 结果集
List<Object> list = new ArrayList<>();
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeNoParent.size(); i++) {
MaterialType materialType = materialTypeNoParent.get(i);
Future<Object> future = completionService.submit(new Task(materialType, mname, ""));
futureList.add(future);
}
// 3.获取结果
for (int i = 0; i < materialTypeNoParent.size(); i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
// 构造树形组件数据模板 // 构造树形组件数据模板
public Map<String, Object> InitTreeMenus(MaterialType mt, List<Object> children) { public Map<String, Object> InitTreeMenus(MaterialType mt, List<Object> children) {
if (mt != null) { if (mt != null) {
@ -2383,7 +2261,6 @@ public class MaterialServiceImpl implements MaterialService {
// 用于测试构造属性框 // 用于测试构造属性框
public List<Object> InitTreeMenus_Test() { public List<Object> InitTreeMenus_Test() {
List<Object> list = new ArrayList<>(); List<Object> list = new ArrayList<>();
List<String> wms_materialTree_result = redisPool.getRedisTemplateByDb(15).opsForList().range("wms_materialTree_result", 0, -1); List<String> wms_materialTree_result = redisPool.getRedisTemplateByDb(15).opsForList().range("wms_materialTree_result", 0, -1);
if (wms_materialTree_result != null && wms_materialTree_result.size() != 0) { if (wms_materialTree_result != null && wms_materialTree_result.size() != 0) {
try { try {
@ -2505,8 +2382,7 @@ public class MaterialServiceImpl implements MaterialService {
// 获取当前父类的子类 // 获取当前父类的子类
List<MaterialType> materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(param); List<MaterialType> materialTypeByCondition = materialTypeMapper.findMaterialTypeByCondition(param);
if (materialTypeByCondition.size() > 0 && (level == staticlevel)) { if (materialTypeByCondition.size() > 0 && (level == staticlevel)) {
for (int i = 0; i < materialTypeByCondition.size(); i++) { for (MaterialType mt : materialTypeByCondition) {
MaterialType mt = materialTypeByCondition.get(i);
List<Object> childForMaterialTypeByParent_test = findChildForMaterialTypeByParent_Test(mt.getOldId(), level + 1, staticlevel); List<Object> childForMaterialTypeByParent_test = findChildForMaterialTypeByParent_Test(mt.getOldId(), level + 1, staticlevel);
Map<String, Object> stringObjectMap = null; Map<String, Object> stringObjectMap = null;
if (childForMaterialTypeByParent_test == null) { if (childForMaterialTypeByParent_test == null) {
@ -2918,34 +2794,6 @@ public class MaterialServiceImpl implements MaterialService {
} }
} }
class TaskForTaking implements Callable<Object> {
MaterialType mt;
String mname;
String placeId;
String depositoryId;
public TaskForTaking(MaterialType mt, String mname, String depositoryId, String placeId) {
this.mt = mt;
this.mname = mname;
this.placeId = placeId;
this.depositoryId = depositoryId;
}
@Override
public Object call() throws Exception {
List<Object> childForMaterialTypeByParent = findChildForMaterialTypeByParent(mt.getOldId(), mname, depositoryId, placeId);
Map<String, Object> stringObjectMap = new HashMap<>();
if (childForMaterialTypeByParent != null) {
stringObjectMap = InitTreeMenus(mt, childForMaterialTypeByParent);
} else {
List<Object> materialByType = AddMaterialByType(mt, mname, depositoryId, placeId);
stringObjectMap = InitTreeMenus(mt, materialByType);
}
return stringObjectMap;
}
}
// 用于执行测试新算法 // 用于执行测试新算法
class TaskTest implements Callable<Object> { class TaskTest implements Callable<Object> {
@ -2973,63 +2821,6 @@ public class MaterialServiceImpl implements MaterialService {
} }
} }
// 用于执行测试新算法(通过物料名称搜索)
// 用于执行测试新算法
class TaskTest_New implements Callable<Object> {
// 待处理的物料类型id列表
List<Long> materialTypeIdList;
public TaskTest_New(List<Long> materialTypeByCondition) {
this.materialTypeIdList = materialTypeByCondition;
}
@Override
public Object call() throws Exception {
// 定义树结构结果集
List<Object> list = new ArrayList<>();
// 查询当前物料类型id列表中的物料类型
List<Material> materialByTypeIds = materialMapper.findMaterialByTypeIds(materialTypeIdList);
// 查询当前物料类型所包含的物料
List<MaterialType> materialTypeByOldIds = materialTypeMapper.findMaterialTypeByOldIds(materialTypeIdList);
// 定义线程集
int threadSize = materialTypeByOldIds.size();
ExecutorService exs = new ThreadPoolExecutor(threadSize, threadSize, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(threadSize));
// 定义线程结果集
List<Future<Object>> futureList = new ArrayList<Future<Object>>();
// 1.定义CompletionService
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(exs);
for (int i = 0; i < materialTypeByOldIds.size(); i++) {
// 获取当前物料类型
MaterialType mt = materialTypeByOldIds.get(i);
// 开启对应线程
Future<Object> future = completionService.submit(new MtTaskTest_New(mt, materialByTypeIds));
// 添加到线程结果列表
futureList.add(future);
}
// 3.获取结果
for (int i = 0; i < materialTypeIdList.size(); i++) {
Object result = null;
try {
result = completionService.take().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
list.add(result);
}
return list;
}
}
// 用于执行测试新算法 // 用于执行测试新算法
class MtTaskTest_New implements Callable<Object> { class MtTaskTest_New implements Callable<Object> {

42
src/test/java/com/dreamchaser/depository_manage/OtherTest.java

@ -93,10 +93,50 @@ public class OtherTest {
return JSONObject.parseObject(JSONObject.toJSONString(map), UserByPort.class); return JSONObject.parseObject(JSONObject.toJSONString(map), UserByPort.class);
} }
@Test @Test
public void main() { public void main() {
// ExecutorService exs = new ThreadPoolExecutor(10, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); ExecutorService exs = new ThreadPoolExecutor(10, 100, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10),new ThreadPoolExecutor.DiscardPolicy());
for (int i = 0; i < 20; i++) {
int finalI = i;
exs.submit(()->{
Random random = new Random();
int threadSize = random.nextInt(9999);
try {
Thread.sleep(threadSize);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("开始执行第"+ finalI +"个任务");
});
}
for (int i = 0; i < 1000; i++) {
}
ThreadPoolExecutor threadPool = (ThreadPoolExecutor) exs;
exs.shutdown(); // 禁止提交新任务
// 设定最大重试次数
try {
// 等待 60 s
if (!exs.awaitTermination(60, TimeUnit.SECONDS)) {
// 调用 shutdownNow 取消正在执行的任务
exs.shutdownNow();
// 再次等待 60 s,如果还未结束,可以再次尝试,或者直接放弃
if (!exs.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("线程池任务未正常执行结束");
}
} catch (InterruptedException ie) {
// 重新调用 shutdownNow
exs.shutdownNow();
}
exs.submit(()->{
System.out.println("全部结束后提交新任务");
});
} }
@Test @Test

Loading…
Cancel
Save