封装的多线程查询工具,需要依赖mybatis-plus开启线程池

文章目录


一、MdUtils

java 复制代码
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import com.eam.common.utils.spring.SpringUtils;
import lombok.SneakyThrows;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.concurrent.Future;

public class MdUtils {

    /**
     *
     * @param clz  查询的isvc
     * @param wrapper 查询的wrapper
     * @param i 线程类数
     * @param columns 需要查询的字段
     */
    @SafeVarargs
    public static  <T>List<T>  doPackageResCallables(Class<? extends IService<T>> clz, LambdaQueryWrapper<T> wrapper, Long i, SFunction<T, ?>... columns){
        List<MdCallable<T>> mdCallables = packageCallables(clz, wrapper,i,columns);
        return executeTask(mdCallables);
    }

    @SafeVarargs
    public static  <T>List<T>  doPackageResCallables(Class<? extends IService<T>> clz,LambdaQueryWrapper<T> wrapper,SFunction<T, ?>... columns){
        List<MdCallable<T>> mdCallables = packageCallables(clz, wrapper,columns);
        return executeTask(mdCallables);
    }
    @SafeVarargs
    public static <T>List<MdCallable<T>> packageCallables(Class<? extends IService<T>> clz,LambdaQueryWrapper<T> wrapper, SFunction<T, ?>... columns){
        return packageCallables(clz,wrapper,200L,columns);
    }
    @SafeVarargs
    public static <T>List<MdCallable<T>> packageCallables(Class<? extends IService<T>> clz,LambdaQueryWrapper<T> wrapper,Long i, SFunction<T, ?>... columns){
        IService<T> bean = SpringUtils.getBean(clz);
        long count = bean.count();
        i = (Objects.isNull(i) || 0 == i) ? 10 : count>i?i:count;
        Long pageSize = count / i;
        List<MdCallable<T>> ts = new ArrayList<>();
        for (Long l = 0L; l < i; l++) {
            ts.add(new MdCallable<T>(pageSize*l,pageSize,clz,wrapper,columns));
        }
        return ts;
    }

    @SneakyThrows
    @SuppressWarnings("ALL")
    public static  <T>List<T>  executeTask(List<MdCallable<T>> c){
        List<Future<T>> priceFutureList = new ArrayList<>();
        ArrayList<T> res = new ArrayList<>();
        c.forEach(tCallable -> priceFutureList.add(SpringUtils.getBean(ThreadPoolTaskExecutor.class).submit((Callable<T>) tCallable)));
        for (Future<T> f : priceFutureList) {
            res.addAll((List<T>)  f.get());
        }
        return res;
    }
    	//获取结果集
      public static<T> List<T> getFotFutureList(Class<T> clz,List l){
        for (Object o : l) {
            if (o instanceof List && !((List<?>) o).isEmpty() && ((List<?>) o).get(0).getClass().equals(clz)){
                    return (List<T>) o;
            }
        }
        return null;
    }

	//异步获取任务
    @SafeVarargs
    public static <U>List<U> doCompletableFuture(Supplier<U>... supplier){
        List<CompletableFuture<U>> collect = new ArrayList<>(Arrays.asList(supplier)).stream().map(supplierSig -> CompletableFuture.supplyAsync(supplierSig, SpringUtils.getBean(ThreadPoolTaskExecutor.class))).collect(Collectors.toList());
        CompletableFuture.allOf(collect.toArray(new CompletableFuture[0])).join();
        return collect.stream().map(CompletableFuture::join).collect(Collectors.toList());
    }
}

二、MdCallable

java 复制代码
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import com.eam.common.utils.spring.SpringUtils;
import lombok.AllArgsConstructor;

import java.util.List;
import java.util.concurrent.Callable;

@AllArgsConstructor
public class  MdCallable<T> implements Callable<List<T>> {
    Long limit0;
    Long limit1;
    Class<? extends IService<T>> clz;
    LambdaQueryWrapper<T> wrapper;
    SFunction<T, ?>[] columns;
    @Override
    public List<T> call() throws Exception {
        return SpringUtils.getBean(clz).list(wrapper.select(columns).last(" LIMIT " +limit0 + "," + limit1 + ";"));
    }
}

三、调用

java 复制代码
例如:List<ActEamRepairOrder> actEamRepairOrders = doPackageResCallables(ActEamRepairOrderService.class, new LambdaQueryWrapper<ActEamRepairOrder>(), threadNumber,ActEamRepairOrder::getOrderId,ActEamRepairOrder::getOrderName);
相关推荐
码农阿豪18 小时前
Nacos 日志与 Raft 数据清理指南:如何安全释放磁盘空间
java·安全·nacos
直有两条腿18 小时前
【大模型】Langchain4j
java·langchain
love530love18 小时前
Scoop 完整迁移指南:从 C 盘到 D 盘的无缝切换
java·服务器·前端·人工智能·windows·scoop
消失的旧时光-194318 小时前
C++ 多线程与并发系统取向(二)—— 资源保护:std::mutex 与 RAII(类比 Java synchronized)
java·开发语言·c++·并发
莫寒清18 小时前
ThreadLocal
java·面试
学习是生活的调味剂19 小时前
spring bean循环依赖问题分析
java·后端·spring
Coder_Boy_20 小时前
Java(Spring AI)传统项目智能化改造——商业化真实案例(含完整核心代码+落地指南)
java·人工智能·spring boot·spring·微服务
五阿哥永琪20 小时前
1. 为什么java不能用is开头来做布尔值的参数名,会出现反序列化异常。
java·开发语言
笑我归无处20 小时前
Springboot+mybatisplus配置多数据源+分页
spring boot·后端·mybatis
chilavert31821 小时前
技术演进中的开发沉思-371:final 关键字(中)
java·前端·数据库