| | |
| | | |
| | | 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.*; |
| | |
| | | |
| | | 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}") |
| | | 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("加载运行环境失败。"); |
| | | } |
| | | |
| | |
| | | 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") |
| | |
| | | } |
| | | } |
| | | 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); |
| | | } |
| | | } |
| | | } |