zjh
2025-02-15 dc3cb5dea834cde14d1b527c22b35f1d5faebd5a
zjh20250215
4个文件已修改
2个文件已添加
183 ■■■■■ 已修改文件
ltkj-admin/src/main/java/com/ltkj/web/config/timer/ThreadPoolConfiguration.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/service/TjSysAsyncServiceImpl.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-admin/src/main/java/com/ltkj/web/controller/system/SysDeptController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsynAspect.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-framework/src/main/java/com/ltkj/framework/aspectj/AsyncConfig.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ltkj-framework/src/main/java/com/ltkj/framework/aspectj/DataSourceAwareThreadPoolTaskExecutor.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
//    }
//}