From dc3cb5dea834cde14d1b527c22b35f1d5faebd5a Mon Sep 17 00:00:00 2001 From: zjh <1084500556@qq.com> Date: 星期六, 15 二月 2025 19:26:55 +0800 Subject: [PATCH] zjh20250215 --- ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAwareThreadPoolTaskExecutor.java | 28 +++++++ ltkj-admin/src/main/java/com/ltkj/web/controller/system/SysDeptController.java | 4 + ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java | 58 +++++++------ ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsyncConfig.java | 20 +++++ ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsynAspect.java | 42 +++------ ltkj-admin/src/main/java/com/ltkj/web/config/timer/ThreadPoolConfiguration.java | 35 ++++++++ 6 files changed, 130 insertions(+), 57 deletions(-) diff --git a/ltkj-admin/src/main/java/com/ltkj/web/config/timer/ThreadPoolConfiguration.java b/ltkj-admin/src/main/java/com/ltkj/web/config/timer/ThreadPoolConfiguration.java index 5a6b099..396b908 100644 --- a/ltkj-admin/src/main/java/com/ltkj/web/config/timer/ThreadPoolConfiguration.java +++ b/ltkj-admin/src/main/java/com/ltkj/web/config/timer/ThreadPoolConfiguration.java @@ -2,7 +2,11 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.ltkj.framework.aspectj.AsynAspect; +import com.ltkj.framework.datasource.DynamicDataSourceContextHolder; import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -18,13 +22,38 @@ @Configuration @Slf4j public class ThreadPoolConfiguration { + private static final Logger logger = LoggerFactory.getLogger(AsynAspect.class); @Bean(name = "async", destroyMethod = "shutdown") public ThreadPoolExecutor systemCheckPoolExecutorService() { + // 鑾峰彇褰撳墠绾跨▼鐨勬暟鎹簮 + String dataSource = DynamicDataSourceContextHolder.getDataSourceType(); + logger.info("寮傛浼犻�掔嚎绋嬪綋鍓嶇嚎绋嬫暟鎹簮: {}", dataSource); return new ThreadPoolExecutor(3, 10, 60, TimeUnit.SECONDS, - new LinkedBlockingQueue<Runnable>(10000), + new LinkedBlockingQueue<>(10000), new ThreadFactoryBuilder().setNameFormat("default-executor-%d").build(), - (r, executor) -> log.error("system pool is full! ")); + (r, executor) -> logger.error("system pool is full! ")) { + + @Override + public void execute(Runnable task) { + // 鍖呰浠诲姟锛屽皢鏁版嵁婧愪紶閫掑埌寮傛绾跨▼ + super.execute(new Runnable() { + @Override + public void run() { + // 鍦ㄥ紓姝ョ嚎绋嬩腑璁剧疆鏁版嵁婧� + String dataSource = DynamicDataSourceContextHolder.getDataSourceType(); + try { + DynamicDataSourceContextHolder.setDataSourceType(dataSource); + task.run(); + } finally { + // 纭繚鍦ㄤ换鍔℃墽琛屽畬鎴愬悗娓呯悊鏁版嵁婧� + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + }); + } + }; } -} \ No newline at end of file + +} diff --git a/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java b/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java index 3ccc8a5..6b65b14 100644 --- a/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java +++ b/ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java @@ -17,6 +17,7 @@ import com.ltkj.common.utils.IdUtils; import com.ltkj.common.utils.StringUtils; import com.ltkj.framework.config.MatchUtils; +import com.ltkj.framework.datasource.DynamicDataSourceContextHolder; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.hisDto.*; import com.ltkj.hosp.mapper.TjSamplingMapper; @@ -248,7 +249,7 @@ } @Override - @Async("async") + //@Async("async") public void ttextracted(TjOrder tjOrder, TjCustomer tjCustomer, SysUser sysUser, TjReservation tjReservation, TjFlowingWater tjFlowingWater) { tjAskMedicalHistoryService.updateTjAskMedicalHistoryByCusId(tjOrder.getTjNumber(), sysUser.getNickName(), String.valueOf(sysUser.getUserId()), String.valueOf(tjCustomer.getCusId())); @@ -360,7 +361,7 @@ } @Override - @Async("async") + //@Async("async") public void collectFees(TjOrder order, List<TjConsumables> list2, List<TbTransition> tbTransitionList, SysUser sysUser, String discount) { // orderRemarkService.deletedOrderRemarkByTjNum(order.getTjNumber()); // redisCache.deleteObject("getOrderDetailByProParentId" + order.getTjNumber()); @@ -543,7 +544,7 @@ } @Override - @Async("async") + //@Async("async") public void abandonCheck(String tjNumber, TjOrder tjOrder, List<TjOrderDetail> list, SysUser sysUser) { for (TjOrderDetail tjOrderDetail : list) { LambdaQueryWrapper<TjProject> wq1 = new LambdaQueryWrapper<>(); @@ -584,8 +585,11 @@ } @Override -// @Async("async") + //@Async("async") public void updateOrdeltile(List<TjOrderDetail> tjOrderDetailList, SysUser sysUser, TjOrder order,TjOrderRemark orderRemark) { + String currentDataSource = DynamicDataSourceContextHolder.getDataSourceType(); + log.info("寮傛绾跨▼涓殑鏁版嵁婧�: {}", currentDataSource); + String deptname=""; TjProject tjProject = projectService.getById(orderRemark.getProId()); if(null !=tjProject){ @@ -651,7 +655,7 @@ } @Override - @Async("async") + //@Async("async") public void updateOrdeltile2(TjOrderDetail detail, SysUser sysUser) { // for (TjOrderDetail detail : tjOrderDetailList) { detail.setTjStatus(1L); @@ -666,7 +670,7 @@ } @Override -// @Async("async") +// //@Async("async") // @Transactional public Boolean iundividualCharges(TjFlowingWater tjFlowingWater, TjOrder order, TjCustomer customer, SysUser sysUser,String jxbz) { Date dates = new Date(); @@ -2254,7 +2258,7 @@ } @Override - @Async("async") + //@Async("async") public void dockerSetCustomerLisByRedis(List<Long> ksproList, String ksId) { List<TjCustomer> yjAjaxResult = getYjAjaxResult(ksproList); @@ -2264,14 +2268,14 @@ } @Override - @Async("async") + //@Async("async") public void dockerSetYjCustomerByRedis(Long orderId, Long ksId) { //宸叉(鍗曚釜瀛樺叆)0鏈,1宸叉 getDgYjAjaxResult(orderId, ksId); } @Override - @Async("async") + //@Async("async") public void dockerSetWjCustomerByRedis(Long orderId, Long ksId) { //鏈(鍗曚釜瀛樺叆)0鏈,1宸叉 @@ -2279,7 +2283,7 @@ } @Override - @Async("async") + //@Async("async") public void checkSetCustomerLisByRedis(String config) { List<TjCustomer> wsResult = getWsResult(config); List<TjCustomer> ysResult = getYsResult(config); @@ -2289,7 +2293,7 @@ } @Override - @Async("async") + //@Async("async") public void wCScheckSetCustomerLisByRedis(List<TjOrder> orderList) { List<TjCustomer> customerList = new ArrayList<>(); if (null != orderList && orderList.size() > 0) { @@ -2324,7 +2328,7 @@ } @Override - @Async("async") + //@Async("async") public void yCScheckSetCustomerLisByRedis(List<TjOrder> orderList) { List<TjCustomer> customerList = new ArrayList<>(); if (null != orderList && orderList.size() > 0) { @@ -2360,7 +2364,7 @@ @Override - @Async("async") + //@Async("async") public void tjRefund(List<TjProject> refundPros, String tjNum) { for (TjProject refundPro : refundPros) { LambdaQueryWrapper<TjProject> wq0 = new LambdaQueryWrapper<>(); @@ -2381,14 +2385,14 @@ } @Override - @Async("async") + //@Async("async") public void saveSampling() { redisCache.setCacheMapValue("sampling", "yqs", getYWqsResult(0)); redisCache.setCacheMapValue("sampling", "wqs", getYWqsResult(1)); } @Override - @Async("async") + //@Async("async") public void tjGoutAsync(List<QjDomainVo> domainVos, SysUser sysUser, Set<String> list) { Integer day = 0; for (QjDomainVo domainVo : domainVos) { @@ -2470,7 +2474,7 @@ } @Override - @Async("async") + //@Async("async") public void addRedisTransitionPac(String cusId, Long pacId, List<TjPackageProject> ppList) { for (TjPackageProject tjPackageProject : ppList) { TjProject project = projectService.getById(tjPackageProject.getProId()); @@ -2509,7 +2513,7 @@ } @Override - @Async("async") + //@Async("async") public void saveRedisTransitionByPacId(String cusId,String cardId, Long pacId, List<Long> proIds) { if (null != pacId) { transitionService.saveRedisTransitionByPacId(cusId,cardId ,pacId); @@ -2520,7 +2524,7 @@ } @Override - @Async("async") + //@Async("async") public void addRedisTransitionPro(String cusId, List<Long> proIds) { for (Long proId : proIds) { if (null != transitionService.getTbTransitionListByCusIdAndPacIdAndProId(cusId, String.valueOf(proId)) && transitionService.getTbTransitionListByCusIdAndPacIdAndProId(cusId, String.valueOf(proId)).size() > 0) { @@ -2562,7 +2566,7 @@ } @Override - @Async("async") + //@Async("async") public void getTjPackageList() { //鐢蜂汉 @@ -2576,7 +2580,7 @@ } @Override - @Async("async") + //@Async("async") public void addNewReservationConfirm(List<TjReservation> rightList) { if (null != rightList && rightList.size() > 0) { for (TjReservation reservation : rightList) { @@ -2611,7 +2615,7 @@ } @Override - @Async("async") + //@Async("async") public void saveNewReservationConfirm(List<TjReservation> rightList) { if (null != rightList && rightList.size() > 0) { //鍒涘缓绾跨▼姹� @@ -2638,14 +2642,14 @@ } @Override - @Async("async") + //@Async("async") public void updateCheckType(String tjNum) { redisCache.setCacheMapValue("updateCheckType" + tjNum, tjNum, getAjaxResult(tjNum)); redisCache.setHashKeyExpireTime("updateCheckType" + tjNum, 7L, TimeUnit.DAYS); } @Override - @Async("async") + //@Async("async") public void getPrintOrderList(List<TjOrder> list) { redisCache.setCacheMapValue("getPrintOrderList", "0", extracted(0, list)); @@ -2654,14 +2658,14 @@ } @Override - @Async("async") + //@Async("async") public void getDictSfxms() { List<DictSfxm> dictSfxm = getDictSfxm(); redisCache.setCacheObject("getDictSfxms", dictSfxm); } @Override - @Async("async") + //@Async("async") public void getOrderDetailByProParentId(String tjNumber, Map<String, Object> map, String proParentId) { if (null != map && !map.isEmpty()) { redisCache.setCacheMapValue("getOrderDetailByProParentId" + tjNumber, proParentId, map); @@ -2673,13 +2677,13 @@ } @Override - @Async("async") + //@Async("async") public void getLineChart() { redisCache.setCacheObject("getLineChart", getLineCharts()); } @Override - @Async("async") + //@Async("async") public void getPieChart() { redisCache.setCacheObject("getPieChart", getPieCharts()); } diff --git a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/SysDeptController.java b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/SysDeptController.java index 57154e3..7e7046a 100644 --- a/ltkj-admin/src/main/java/com/ltkj/web/controller/system/SysDeptController.java +++ b/ltkj-admin/src/main/java/com/ltkj/web/controller/system/SysDeptController.java @@ -25,7 +25,9 @@ import com.ltkj.common.core.text.Convert; import com.ltkj.common.utils.SecurityUtils; import com.ltkj.common.utils.bean.BeanUtils; +import com.ltkj.db.DataSourceContextHolder; import com.ltkj.framework.config.MatchUtils; +import com.ltkj.framework.datasource.DynamicDataSourceContextHolder; import com.ltkj.hosp.domain.*; import com.ltkj.hosp.mapper.TestMapper; import com.ltkj.hosp.service.*; @@ -1382,6 +1384,8 @@ // } // } // } + logger.info("鎺ュ彛 DataSourceContextHolder ->{}", DataSourceContextHolder.getDataSourceKey()); + logger.info("鎺ュ彛 DynamicDataSourceContextHolder ->{}", DynamicDataSourceContextHolder.getDataSourceType()); asyncService.updateOrdeltile(tjOrderDetailList, sysUser, order,orderRemark); LambdaQueryWrapper<TjOrderDetail> qww = new LambdaQueryWrapper<>(); qww.eq(TjOrderDetail::getOrderId, order.getOrderId()); diff --git a/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsynAspect.java b/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsynAspect.java index 1993ebf..0e11b1f 100644 --- a/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsynAspect.java +++ b/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsynAspect.java @@ -1,62 +1,50 @@ package com.ltkj.framework.aspectj; -import com.ltkj.common.annotation.DataSource; -import com.ltkj.common.utils.StringUtils; import com.ltkj.db.DataSourceContextHolder; import com.ltkj.framework.datasource.DynamicDataSourceContextHolder; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; -import org.aspectj.lang.reflect.MethodSignature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.core.annotation.AnnotationUtils; -import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; - -import java.util.Objects; /** * ClassName: AsynAspect <br/> - * Description: <br/> + * Description: 鍦ㄥ紓姝ユ柟娉曟墽琛屾椂锛岃幏鍙栧苟浼犻�掑綋鍓嶇嚎绋嬬殑鏁版嵁婧愩��<br/> * date: 2025/2/15 18:07<br/> * * @author zjh<br /> */ @Aspect -@Order(2) @Component public class AsynAspect { - protected Logger logger = LoggerFactory.getLogger(getClass()); + private static final Logger logger = LoggerFactory.getLogger(AsynAspect.class); - @Pointcut("@annotation(org.springframework.scheduling.annotation.Async)" - + "|| @within(org.springframework.scheduling.annotation.Async)") - public void dsPointCut() { - + @Pointcut("@annotation(org.springframework.scheduling.annotation.Async) || @within(org.springframework.scheduling.annotation.Async)") + public void asyncPointCut() { + // 寮傛鏂规硶鍒囧叆鐐� } - @Around("dsPointCut()") + @Around("asyncPointCut()") public Object around(ProceedingJoinPoint point) throws Throwable { - String key = DataSourceContextHolder.getDataSourceKey(); - logger.info("鎵ц涔嬪墠"); - logger.info("DataSourceContextHolder ->{}",key); - logger.info("DynamicDataSourceContextHolder ->{}", DynamicDataSourceContextHolder.getDataSourceType()); + // 鑾峰彇褰撳墠绾跨▼鐨� DataSource + String currentDataSource = DataSourceContextHolder.getDataSourceKey(); - DynamicDataSourceContextHolder.setDataSourceType(key); + logger.info("褰撳墠绾跨▼鏁版嵁婧�: {}", currentDataSource); + + // 鍦ㄥ紓姝ユ柟娉曟墽琛屽墠锛岃缃暟鎹簮鍒� DynamicDataSourceContextHolder + DynamicDataSourceContextHolder.setDataSourceType(currentDataSource); try { + // 鎵ц寮傛鏂规硶 return point.proceed(); } finally { - logger.info("鎵ц涔嬪悗"); - logger.info("DataSourceContextHolder ->{}",key); - logger.info("DynamicDataSourceContextHolder ->{}",DynamicDataSourceContextHolder.getDataSourceType()); - // 閿�姣佹暟鎹簮 鍦ㄦ墽琛屾柟娉曚箣鍚� + // 鎵ц瀹屾瘯鍚庢竻鐞嗘暟鎹簮 DynamicDataSourceContextHolder.clearDataSourceType(); - logger.info("鎵ц涔嬪悗 clear涔嬪悗"); - logger.info("DataSourceContextHolder ->{}",key); - logger.info("DynamicDataSourceContextHolder ->{}",DynamicDataSourceContextHolder.getDataSourceType()); + logger.info("娓呯悊鏁版嵁婧愶紝鎭㈠榛樿鏁版嵁婧�"); } } } diff --git a/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsyncConfig.java b/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsyncConfig.java new file mode 100644 index 0000000..6e79d8c --- /dev/null +++ b/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsyncConfig.java @@ -0,0 +1,20 @@ +//package com.ltkj.framework.aspectj; +// +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import java.util.concurrent.Executor; +// +//@Configuration +//public class AsyncConfig { +// +// @Bean(name = "async") +// public Executor taskExecutor() { +// DataSourceAwareThreadPoolTaskExecutor executor = new DataSourceAwareThreadPoolTaskExecutor(); +// executor.setCorePoolSize(10); +// executor.setMaxPoolSize(20); +// executor.setQueueCapacity(25); +// executor.setThreadNamePrefix("Async-"); +// executor.initialize(); +// return executor; +// } +//} diff --git a/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAwareThreadPoolTaskExecutor.java b/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAwareThreadPoolTaskExecutor.java new file mode 100644 index 0000000..48fea03 --- /dev/null +++ b/ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAwareThreadPoolTaskExecutor.java @@ -0,0 +1,28 @@ +//package com.ltkj.framework.aspectj; +// +//import com.ltkj.framework.datasource.DynamicDataSourceContextHolder; +//import lombok.extern.slf4j.Slf4j; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +// +////@Slf4j +//public class DataSourceAwareThreadPoolTaskExecutor extends ThreadPoolTaskExecutor { +// private static final Logger logger = LoggerFactory.getLogger(AsynAspect.class); +// @Override +// public void execute(Runnable task) { +// String dataSource = DynamicDataSourceContextHolder.getDataSourceType(); +// logger.info("寮傛浼犻�掔嚎绋嬪綋鍓嶇嚎绋嬫暟鎹簮: {}", dataSource); +// Runnable wrappedTask = () -> { +// try { +// // 灏嗗綋鍓嶆暟鎹簮浼犻�掑埌寮傛绾跨▼ +// DynamicDataSourceContextHolder.setDataSourceType(dataSource); +// task.run(); +// } finally { +// // 鎵ц瀹屾瘯鍚庢竻鐞嗘暟鎹簮 +// DynamicDataSourceContextHolder.clearDataSourceType(); +// } +// }; +// super.execute(wrappedTask); +// } +//} -- Gitblit v1.8.0