From 558ffc4bcaf7aa5c683e7c9ce01e971feb9e4d95 Mon Sep 17 00:00:00 2001
From: dengzedong <dengzedong@email>
Date: 星期一, 14 十月 2024 14:11:48 +0800
Subject: [PATCH] 模型打包租户隔离 备份文件租户隔离

---
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java |   49 +++++++++++++++++++++++--------------------------
 1 files changed, 23 insertions(+), 26 deletions(-)

diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java
index 0c77b58..65a2438 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java
@@ -4,18 +4,19 @@
 import com.alibaba.fastjson.JSONArray;
 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 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.*;
 import org.springframework.web.multipart.MultipartFile;
 
 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,6 +31,7 @@
  * @createTime 2024年08月08日
  */
 @RestController
+@Slf4j
 @RequestMapping("/model/mpk/api")
 public class MdkController {
     @Value("${mpk.bak-file-path}")
@@ -38,21 +40,29 @@
 
     @PostMapping("run")
     public CommonResult<String> run(@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,14 +102,16 @@
                 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();
         }
     }
@@ -117,20 +129,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);
-        }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.3