dengzedong
2024-10-14 3e18d4bfbf2c657b08b21512c2d884cc9d59df7b
iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java
@@ -2,12 +2,17 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.iail.utils.RSAUtils;
import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants;
import com.iailab.framework.common.pojo.CommonResult;
import com.iailab.framework.tenant.core.context.TenantContextHolder;
import com.iailab.module.model.mpk.common.MdkConstant;
import com.iailab.module.model.mpk.common.utils.DllUtils;
import com.iailab.module.model.mpk.common.utils.Readtxt;
import com.iailab.module.model.mpk.dto.MdkDTO;
import com.iailab.module.model.mpk.dto.MdkRunDTO;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@@ -15,7 +20,6 @@
import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
@@ -30,29 +34,43 @@
 * @createTime 2024年08月08日
 */
@RestController
@Slf4j
@RequestMapping("/model/mpk/api")
public class MdkController {
    @Value("${mpk.bak-file-path}")
    private String mpkBakFilePath;
    @PostMapping("run")
    public CommonResult<String> run(@RequestBody MdkDTO dto) {
    /**
     * @description: 模型测试运行
     * @author: dzd
     * @date: 2024/10/14 15:26
     **/
    @PostMapping("test")
    public CommonResult<String> test(@RequestBody MdkDTO dto) {
        Long tenantId = TenantContextHolder.getTenantId();
        // 备份文件 租户隔离
        String mpkTenantBakFilePath = mpkBakFilePath + File.separator + tenantId;
        Class<?> clazz;
        URLClassLoader classLoader;
        try {
            File jarFile = new File(mpkBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getPyName() + ".jar");
            File jarFile = new File(mpkTenantBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getPyName() + ".jar");
            if (!jarFile.exists()) {
                throw new RuntimeException("jar包不存在,请先生成代码。jarPath:" + jarFile.getAbsolutePath());
            }
            File dllFile = new File(mpkBakFilePath + File.separator + MdkConstant.DLL + File.separator + dto.getPyName() + ".dll");
            File dllFile = new File(mpkTenantBakFilePath + File.separator + MdkConstant.DLL + File.separator + dto.getPyName() + ".dll");
            if (!dllFile.exists()) {
                throw new RuntimeException("dllw文件不存在,请先生成代码。dllPath:" + dllFile.getAbsolutePath());
                throw new RuntimeException("dll文件不存在,请先生成代码。dllPath:" + dllFile.getAbsolutePath());
            }
            // 加载jar包
            loadJar(jarFile.getAbsolutePath());
            // 加载dll
            System.load(dllFile.getAbsolutePath());
            classLoader = DllUtils.loadJar(jarFile.getAbsolutePath());
            // 实现类
            clazz = classLoader.loadClass(dto.getClassName());
            // 加载dll到实现类
            DllUtils.loadDll(clazz,dllFile.getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("加载运行环境失败。");
        }
@@ -92,16 +110,49 @@
                paramsArray[datas.size()] = HashMap.class;
            }
            Class<?> clazz = Class.forName(dto.getClassName());
            Method method = clazz.getMethod(dto.getMethodName(), paramsArray);
            HashMap result = (HashMap)method.invoke(clazz.newInstance(), paramsValueArray);
            HashMap result = (HashMap) clazz.getDeclaredMethod(dto.getMethodName(), paramsArray).invoke(clazz.newInstance(), paramsValueArray);
            return success(JSON.toJSONString(result));
        } catch (Exception ex) {
            ex.printStackTrace();
            return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常");
        } finally {
            if (classLoader != null) {
                DllUtils.unloadDll(classLoader);
                DllUtils.unloadJar(classLoader);
            }
            System.gc();
        }
    }
    /**
     * @description: 模型运行
     * @author: dzd
     * @date: 2024/10/14 15:26
     **/
    @PostMapping("run")
    public CommonResult<String> run(@RequestBody MdkRunDTO dto) {
        if (RSAUtils.checkLisenceBean().getCode() != 1) {
            log.error("Lisence 不可用!");
            return CommonResult.error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"Lisence 不可用!");
        } else {
            try {
                URLClassLoader classLoader = DllUtils.getClassLoader(dto.getProjectId());
                if (null == classLoader) {
                    return CommonResult.error(GlobalErrorCodeConstants.ERROR_CONFIGURATION.getCode(),"请先发布项目!");
                }
                Class<?> clazz = classLoader.loadClass(dto.getClassName());
                Method method = clazz.getMethod(dto.getMethodName(), dto.getParamsClassArray());
                HashMap invoke = (HashMap) method.invoke(clazz.newInstance(), dto.getParamsValueArray());
                // todo 将结果存入数据库
            } catch (Exception e) {
                log.error("模型运行失败",e);
                return CommonResult.error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"模型运行失败!");
            }
        }
        return CommonResult.success();
    }
    @PostMapping("/import")
@@ -117,20 +168,5 @@
            }
        }
        return success(result);
    }
    private void loadJar(String jarPath) throws Exception {
        File jarFile = new File(jarPath);
        if (!jarFile.exists()) {
            throw new Exception("jar沒有找到!");
        } else {
            Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
            boolean accessible = method.isAccessible();
            method.setAccessible(true);
            URLClassLoader classLoader = (URLClassLoader)ClassLoader.getSystemClassLoader();
            URL url = jarFile.toURI().toURL();
            method.invoke(classLoader, url);
            method.setAccessible(accessible);
        }
    }
}