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(); } } }); } }; } } 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<>(); @@ -586,6 +587,9 @@ @Override // @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()); } 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()); 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("清理数据源,恢复默认数据源"); } } } ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsyncConfig.java
New file @@ -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; // } //} ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAwareThreadPoolTaskExecutor.java
New file @@ -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); // } //}