| | |
| | | import com.iailab.framework.common.exception.enums.GlobalErrorCodeConstants; |
| | | import com.iailab.framework.common.pojo.CommonResult; |
| | | 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; |
| | |
| | | * @createTime 2024年08月08日 |
| | | */ |
| | | @RestController |
| | | @Slf4j |
| | | @RequestMapping("/model/mpk/api") |
| | | public class MdkController { |
| | | @Value("${mpk.bak-file-path}") |
| | |
| | | |
| | | @PostMapping("run") |
| | | public CommonResult<String> run(@RequestBody MdkDTO dto) { |
| | | |
| | | Class<?> clazz; |
| | | URLClassLoader classLoader; |
| | | try { |
| | | File jarFile = new File(mpkBakFilePath + File.separator + MdkConstant.JAR + File.separator + dto.getPyName() + ".jar"); |
| | | if (!jarFile.exists()) { |
| | |
| | | } |
| | | File dllFile = new File(mpkBakFilePath + 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("加载运行环境失败。"); |
| | | } |
| | | |
| | |
| | | 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(); |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | | } |