From 6434fc445f48cffd49df9738576d5e340163ed34 Mon Sep 17 00:00:00 2001 From: houzhongjian <houzhongyi@126.com> Date: 星期五, 11 十月 2024 09:42:54 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictReqDTO.java | 5 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageReqDTO.java | 36 ++++ iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java | 28 +- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java | 112 ++++++++++- iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestRespDTO.java | 2 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiIndItemController.java | 53 +++++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java | 76 ++++++++ iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/ind/IndItemApi.java | 4 iailab-module-data/iailab-module-data-biz/src/main/resources/application-prod.yml | 2 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageRespDTO.java | 2 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MpkFileService.java | 3 iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml | 4 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java | 26 +- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java | 7 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java | 25 +- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MdkController.java | 4 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictModelSettingReqDTO.java | 30 +++ iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiDataController.java | 4 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java | 23 ++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java | 8 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkScheduleReqDTO.java | 5 iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleModelSettingReqDTO.java | 24 ++ iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestReqDTO.java | 34 +++ iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java | 2 24 files changed, 449 insertions(+), 70 deletions(-) diff --git a/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/ind/IndItemApi.java b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/ind/IndItemApi.java index 71c88d7..f4120fe 100644 --- a/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/ind/IndItemApi.java +++ b/iailab-module-data/iailab-module-data-api/src/main/java/com/iailab/module/data/api/ind/IndItemApi.java @@ -25,10 +25,10 @@ String PREFIX = ApiConstants.PREFIX + "/ind-item"; @GetMapping(PREFIX + "/query-ind/default-value") - @Operation(summary = "查询指标项") + @Operation(summary = "查询指标默认值") List<ApiIndItemValueDTO> queryIndItemDefaultValue(@RequestParam String itemNo); @PostMapping(PREFIX + "/query-ind/history-value") - @Operation(summary = "查询指标项") + @Operation(summary = "查询指标历史值") List<ApiIndItemValueDTO> queryIndItemHistoryValue(@RequestBody ApiIndItemQueryDTO dto); } \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/DataController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiDataController.java similarity index 98% rename from iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/DataController.java rename to iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiDataController.java index bc0bdf7..4072571 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/DataController.java +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiDataController.java @@ -22,6 +22,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.security.PermitAll; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; @@ -39,7 +40,7 @@ @RestController @RequestMapping("/api/data") @Tag(name = "数据") -public class DataController { +public class ApiDataController { @Resource private DaPointService daPointService; @@ -56,6 +57,7 @@ @Resource private PointCollector pointCollector; + @PermitAll @PostMapping("/point/history") @Operation(summary = "point历史数据") public CommonResult<Map<String, List<Map<String, Object>>>> pointHistory(HttpServletResponse response, HttpServletRequest diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiIndItemController.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiIndItemController.java new file mode 100644 index 0000000..86b5abf --- /dev/null +++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/api/controller/ApiIndItemController.java @@ -0,0 +1,53 @@ +package com.iailab.module.data.api.controller; + +import com.iailab.framework.common.pojo.CommonResult; +import com.iailab.framework.common.util.object.ConvertUtils; +import com.iailab.module.data.api.ind.dto.ApiIndItemQueryDTO; +import com.iailab.module.data.api.ind.dto.ApiIndItemValueDTO; +import com.iailab.module.data.ind.collection.IndItemCollector; +import com.iailab.module.data.ind.item.vo.IndItemValueVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.security.PermitAll; +import java.util.List; + +import static com.iailab.framework.common.pojo.CommonResult.success; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年10月10日 + */ +@Slf4j +@RestController +@RequestMapping("/api/data/ind-item") +@Tag(name = "指标") +public class ApiIndItemController { + + @Autowired + private IndItemCollector indItemCollector; + + @PermitAll + @GetMapping("/query-ind/default-value") + @Operation(summary = "查询指标默认值") + public CommonResult<List<ApiIndItemValueDTO>> queryIndItemDefaultValue(@RequestParam String itemNo) { + List<IndItemValueVO> list = indItemCollector.queryValue(itemNo); + return success(ConvertUtils.sourceToTarget(list, ApiIndItemValueDTO.class)); + + } + + @PermitAll + @GetMapping("/query-ind/history-value") + @Operation(summary = "查询指标历史值") + public CommonResult<List<ApiIndItemValueDTO>> queryIndItemHistoryValue(@RequestParam ApiIndItemQueryDTO dto) { + List<IndItemValueVO> list = indItemCollector.queryValue(dto.getItemNo(), dto.getStart(), dto.getEnd()); + return success(ConvertUtils.sourceToTarget(list, ApiIndItemValueDTO.class)); + } +} \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-prod.yml b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-prod.yml index 5d3d877..79ac1f5 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-prod.yml +++ b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-prod.yml @@ -61,7 +61,7 @@ token: FLkSbhpYgPrMJBNnOdmxuY3YcG8D_roPtdGPEhwXW9JSxJkEPe1sXUkrYgWcV-nOL9Zjm09RoTfMW44NoRYaXA== url: http://192.168.55.180:8086 username: root - password: ntt12345678 + password: iailab12345678 iems: upload-dir: C:/DLUT/upload/ \ No newline at end of file diff --git a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml index 3ff6ab8..3f9ce6a 100644 --- a/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml +++ b/iailab-module-data/iailab-module-data-biz/src/main/resources/application-test.yaml @@ -51,8 +51,8 @@ influx-db: org: iailab - bucket: iailab_data - token: 2_wr57sVbZQx2QHhN3wWNGOCOtPan_NdCu06NsCGcB8G7rjhjK3yHcLf3uTXE9xkjHHSQwo37E1Mxa0367qXgg== + bucket: buk_shasteel + token: Q2qsriQG3FEfZ35lik1KSkFToma3bsgfQLwJrNQfSK06MC569sZ9mrQ0vLtsVYn70HMfQcC9gf_yUG16JQtm8w== url: http://172.16.8.200:8086 username: root password: iailab12345678 diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java index abb31a0..99d264b 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/McsApi.java @@ -1,10 +1,7 @@ package com.iailab.module.model.api.mcs; import com.iailab.framework.common.pojo.CommonResult; -import com.iailab.module.model.api.mcs.dto.AlarmMessageDTO; -import com.iailab.module.model.api.mcs.dto.PredictItemInfoDTO; -import com.iailab.module.model.api.mcs.dto.PredictItemTreeDTO; -import com.iailab.module.model.api.mcs.dto.ScheduleSuggestDTO; +import com.iailab.module.model.api.mcs.dto.*; import com.iailab.module.model.enums.ApiConstants; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -23,7 +20,7 @@ * @createTime 2024年08月26日 */ @FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC 服务 - MCS") +@Tag(name = "RPC 服务 - 模型配置接口") public interface McsApi { String PREFIX = ApiConstants.PREFIX + "/mcs"; @@ -38,18 +35,25 @@ @PostMapping(PREFIX + "/alarm-message/create") @Operation(summary = "添加预警信息") - CommonResult<Boolean> createAlarmMessage(@RequestBody AlarmMessageDTO dto); + CommonResult<Boolean> createAlarmMessage(@RequestBody AlarmMessageRespDTO dto); @GetMapping(PREFIX + "/alarm-message/list") - @Operation(summary = "获取预警信息") - CommonResult<AlarmMessageDTO> listAlarmMessage(@RequestParam Map<String, Object> params); + @Operation(summary = "获取预警信息列表") + CommonResult<AlarmMessageRespDTO> listAlarmMessage(@RequestParam Map<String, Object> params); @PostMapping(PREFIX + "/schedule-suggest/create") @Operation(summary = "添加调度建议") - CommonResult<Boolean> createScheduleSuggest(@RequestBody ScheduleSuggestDTO dto); + CommonResult<Boolean> createScheduleSuggest(@RequestBody ScheduleSuggestRespDTO dto); @GetMapping(PREFIX + "/alarm-message/list") - @Operation(summary = "获取调度建议") - CommonResult<ScheduleSuggestDTO> listScheduleSuggest(@RequestParam Map<String, Object> params); + @Operation(summary = "获取调度建议列表") + CommonResult<ScheduleSuggestRespDTO> listScheduleSuggest(@RequestParam ScheduleSuggestReqDTO params); + @PostMapping(PREFIX + "/predict-model-setting/modify") + @Operation(summary = "修改预测模型设置参数") + CommonResult<Boolean> modifyPredictModelSetting(@RequestBody List<PredictModelSettingReqDTO> dtos); + + @PostMapping(PREFIX + "/schedule-model-setting/modify") + @Operation(summary = "修改调度模型设置参数") + CommonResult<Boolean> modifyScheduleModelSetting(@RequestBody List<ScheduleModelSettingReqDTO> dtos); } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageReqDTO.java new file mode 100644 index 0000000..a55af61 --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageReqDTO.java @@ -0,0 +1,36 @@ +package com.iailab.module.model.api.mcs.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年10月10日 + */ +@Schema(description = "RPC 模型 - 预警消息 DTO") +@Data +public class AlarmMessageReqDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "监控对象") + private String alarmObj; + + @Schema(description = "监控点位ID") + private String pointId; + + @Schema(description = "预测项ID") + private String itemId; + + @Schema(description = "预警时间") + private Date alarmTime; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageRespDTO.java similarity index 95% rename from iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageDTO.java rename to iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageRespDTO.java index e4be30f..c9d164d 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageDTO.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/AlarmMessageRespDTO.java @@ -20,7 +20,7 @@ */ @Schema(description = "RPC 模型 - 预警消息 DTO") @Data -public class AlarmMessageDTO implements Serializable { +public class AlarmMessageRespDTO implements Serializable { private static final long serialVersionUID = 1L; diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictModelSettingReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictModelSettingReqDTO.java new file mode 100644 index 0000000..5d1f29b --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/PredictModelSettingReqDTO.java @@ -0,0 +1,30 @@ +package com.iailab.module.model.api.mcs.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年10月10日 + */ +@Schema(description = "RPC 模型 - 调度建议 DTO") +@Data +public class PredictModelSettingReqDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String modelid; + + /** + * 键 + */ + private String key; + + /** + * 值 + */ + private String value; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleModelSettingReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleModelSettingReqDTO.java new file mode 100644 index 0000000..bd40728 --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleModelSettingReqDTO.java @@ -0,0 +1,24 @@ +package com.iailab.module.model.api.mcs.dto; + +import java.io.Serializable; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年10月10日 + */ +public class ScheduleModelSettingReqDTO implements Serializable { + private static final long serialVersionUID = 1L; + + private String modelid; + + /** + * 键 + */ + private String key; + + /** + * 值 + */ + private String value; +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestReqDTO.java new file mode 100644 index 0000000..ba217bd --- /dev/null +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestReqDTO.java @@ -0,0 +1,34 @@ +package com.iailab.module.model.api.mcs.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author PanZhibao + * @Description + * @createTime 2024年10月10日 + */ +@Schema(description = "RPC 模型 - 调度建议req DTO") +@Data +public class ScheduleSuggestReqDTO implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "预测项ID") + private String itemId; + + @Schema(description = "模型ID") + private String modelId; + + @Schema(description = "调整对象") + private String adjustObj; + + @Schema(description = "开始时间") + private Date startTime; + + @Schema(description = "结束时间") + private Date endTime; + +} \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestRespDTO.java similarity index 96% rename from iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestDTO.java rename to iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestRespDTO.java index 9151fae..a0418c1 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestDTO.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mcs/dto/ScheduleSuggestRespDTO.java @@ -14,7 +14,7 @@ */ @Schema(description = "RPC 模型 - 调度建议 DTO") @Data -public class ScheduleSuggestDTO implements Serializable { +public class ScheduleSuggestRespDTO implements Serializable { private static final long serialVersionUID = 1L; diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java index d098d94..54be190 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/MdkApi.java @@ -2,11 +2,10 @@ import com.iailab.module.model.api.mdk.dto.*; import com.iailab.module.model.enums.ApiConstants; -import com.iailab.framework.common.pojo.CommonResult; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import javax.validation.Valid; @@ -17,25 +16,24 @@ * @createTime 2024年08月26日 */ @FeignClient(name = ApiConstants.NAME) -@Tag(name = "RPC 服务 - MDK") +@Tag(name = "RPC 服务 - 模型调用接口") public interface MdkApi { String PREFIX = ApiConstants.PREFIX + "/mdk"; - @GetMapping(PREFIX + "/predict-module") - @Operation(summary = "模块预测") - CommonResult<MdkPredictModuleRespDTO> predictModule(@Valid @RequestBody MdkPredictReqDTO reqDTO); + @PostMapping(PREFIX + "/predict-module") + @Operation(summary = "执行模块预测") + MdkPredictModuleRespDTO predictModule(@Valid @RequestBody MdkPredictReqDTO reqDTO); - @GetMapping(PREFIX + "/predict-item") - @Operation(summary = "单独预测") - CommonResult<MdkPredictItemRespDTO> predictItem(@Valid @RequestBody MdkPredictReqDTO reqDTO); + @PostMapping(PREFIX + "/predict-item") + @Operation(summary = "执行单独预测") + MdkPredictItemRespDTO predictItem(@Valid @RequestBody MdkPredictReqDTO reqDTO); - @GetMapping(PREFIX + "/predict-auto-adjust") + @PostMapping(PREFIX + "/predict-adjust") @Operation(summary = "预测自动调整") - CommonResult<Boolean> predictAutoAdjust(@Valid @RequestBody MdkPredictReqDTO reqDTO); + Boolean predictAutoAdjust(@Valid @RequestBody MdkPredictReqDTO reqDTO); - - @GetMapping(PREFIX + "/schedule") - @Operation(summary = "执行调度") - CommonResult<MdkScheduleRespDTO> doSchedule(@Valid @RequestBody MdkScheduleReqDTO reqDTO); + @PostMapping(PREFIX + "/schedule-scheme") + @Operation(summary = "执行调度方案") + MdkScheduleRespDTO doSchedule(@Valid @RequestBody MdkScheduleReqDTO reqDTO); } diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictReqDTO.java index 0cef75c..c8d1297 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictReqDTO.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkPredictReqDTO.java @@ -3,6 +3,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import javax.validation.constraints.NotNull; import java.util.Date; /** @@ -14,9 +15,13 @@ @Data public class MdkPredictReqDTO { + @Schema(description = "预测时间") + @NotNull(message="预测时间不能为空") private Date predictTime; + @Schema(description = "预测模块") private String moduleType; + @Schema(description = "预测项编号") private String itemNo; } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkScheduleReqDTO.java b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkScheduleReqDTO.java index f0a18cc..b0ae867 100644 --- a/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkScheduleReqDTO.java +++ b/iailab-module-model/iailab-module-model-api/src/main/java/com/iailab/module/model/api/mdk/dto/MdkScheduleReqDTO.java @@ -3,6 +3,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import javax.validation.constraints.NotNull; import java.util.Date; import java.util.Map; @@ -15,8 +16,12 @@ @Data public class MdkScheduleReqDTO { + @Schema(description = "调度方案编号") + @NotNull(message="调度方案编号不能为空") private String scheduleCode; + @Schema(description = "调度方案时间") + @NotNull(message="调度方案时间不能为空") private Date scheduleTime; private String modelCode; diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java index 4cb632e..c649998 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/ModelServiceApplication.java @@ -1,27 +1,37 @@ package com.iailab; +import com.iailab.module.model.mpk.common.MdkConstant; +import com.iailab.module.model.mpk.common.utils.DllUtils; import iail.mdk.model.common.Environment; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; +import javax.annotation.PostConstruct; import java.io.File; import java.io.InputStream; import java.util.Properties; @EnableAsync @SpringBootApplication +@Slf4j public class ModelServiceApplication implements CommandLineRunner { - static { + @Value("${mpk.bak-file-path}") + private String mpkBakFilePath; + + @PostConstruct + void init() { //加载动态链接库 try { Properties properties = new Properties(); InputStream in = ModelServiceApplication.class.getClassLoader().getResourceAsStream("iailmdk.properties"); properties.load(in); String mdkInitPath = properties.getProperty("mdk-init-path"); - System.out.println("mdkInitPath=" + mdkInitPath); + log.info("mdkInitPath=" + mdkInitPath); File file = new File(mdkInitPath + File.separator + "IAIL.MDK.Mid.Windows.dll"); if (!file.exists()) { throw new RuntimeException("动态链接库IAIL.MDK.Mid.Windows.dll文件不存在," + file.getAbsolutePath()); @@ -31,9 +41,16 @@ env.init(); } catch (Exception e) { e.printStackTrace(); - System.out.println("动态链接库IAIL.MDK.Mid.Windows.dll初始化失败"); + log.error("动态链接库IAIL.MDK.Mid.Windows.dll初始化失败"); } + //加载项目已发布的dll和jar + try { + DllUtils.loadProjectPublish(mpkBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH); + } catch (Exception e) { + e.printStackTrace(); + log.error("加载项目已发布的dll和jar失败"); + } } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java index 40a2600..e4ae4ab 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/api/MdkApiImpl.java @@ -22,10 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; import java.util.ArrayList; import java.util.HashMap; @@ -74,7 +71,7 @@ * @return */ @Override - public CommonResult<MdkPredictModuleRespDTO> predictModule(MdkPredictReqDTO reqDTO) { + public MdkPredictModuleRespDTO predictModule(MdkPredictReqDTO reqDTO) { MdkPredictModuleRespDTO resp = new MdkPredictModuleRespDTO(); Map<String, MdkPredictItemRespDTO> predictItemRespMap = new HashMap<>(); try { @@ -112,10 +109,11 @@ } log.info("预测计算结束: " + System.currentTimeMillis()); } catch (Exception ex) { - return error(999, ex.getMessage()); + ex.printStackTrace(); + return resp; } resp.setPredictItemRespMap(predictItemRespMap); - return success(resp); + return resp; } /** @@ -125,7 +123,7 @@ * @return */ @Override - public CommonResult<MdkPredictItemRespDTO> predictItem(@Valid @RequestBody MdkPredictReqDTO reqDTO) { + public MdkPredictItemRespDTO predictItem(MdkPredictReqDTO reqDTO) { MdkPredictItemRespDTO resp = new MdkPredictItemRespDTO(); try { @@ -146,10 +144,10 @@ log.info("预测计算结束: " + System.currentTimeMillis()); } catch (Exception ex) { log.info("预测计算异常: " + System.currentTimeMillis()); - ex.printStackTrace(); + return resp; } - return success(resp); + return resp; } /** @@ -159,10 +157,10 @@ * @return */ @Override - public CommonResult<Boolean> predictAutoAdjust(@Valid @RequestBody MdkPredictReqDTO reqDTO) { + public Boolean predictAutoAdjust(MdkPredictReqDTO reqDTO) { - return success(true); + return true; } /** @@ -172,7 +170,7 @@ * @return */ @Override - public CommonResult<MdkScheduleRespDTO> doSchedule(@Valid @RequestBody MdkScheduleReqDTO reqDTO) { + public MdkScheduleRespDTO doSchedule(MdkScheduleReqDTO reqDTO) { MdkScheduleRespDTO resp = new MdkScheduleRespDTO(); resp.setScheduleCode(reqDTO.getScheduleCode()); resp.setScheduleTime(reqDTO.getScheduleTime()); @@ -184,7 +182,8 @@ } catch (Exception ex) { log.info("调度计算异常: " + System.currentTimeMillis()); ex.printStackTrace(); + return resp; } - return success(resp); + return resp; } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java index 853bd14..2e2b1a5 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mdk/predict/PredictModuleHandler.java @@ -62,6 +62,8 @@ Long drtSave = Duration.between(end, endSave).getSeconds(); log.info(MessageFormat.format("预测项:{0},保存时间:{1}秒", predictItem.getItemName(), drtSave)); + + result.put(predictItem.getItemNo(), predictResult); } catch (Exception e) { e.printStackTrace(); log.error(MessageFormat.format("预测项编号:{0},预测项名称:{1},预测失败:{2} 预测时刻:{3}", diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java index 37c39da..b3be1da 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/MdkConstant.java @@ -34,4 +34,12 @@ * jar */ String JAR = "jar"; + /** + * 分隔符 dll、jar文件名 + */ + String SPLIT = "__"; + /** + * 项目发布dll和jar目录 + */ + String PROJECT_PUBLISH = "projectPublish"; } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java index d4831ad..61cb7a8 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java @@ -1,19 +1,23 @@ package com.iailab.module.model.mpk.common.utils; +import cn.hutool.core.io.FileUtil; +import com.iailab.module.model.mpk.common.MdkConstant; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import sun.misc.URLClassPath; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; +import java.util.HashMap; import java.util.Iterator; import java.util.Vector; @Slf4j public class DllUtils { + + private static HashMap<String, URLClassLoader> classLoaderCache = new HashMap<>(); /** * @description: 加载dll到指定class下 @@ -22,14 +26,14 @@ **/ public static void loadDll(Class<?> clazz, String dllPath) { try { - Method method = Runtime.class.getDeclaredMethod("load0", Class.class,String.class); + Method method = Runtime.class.getDeclaredMethod("load0", Class.class, String.class); boolean accessible = method.isAccessible(); method.setAccessible(true); - method.invoke(Runtime.getRuntime(), clazz,dllPath); + method.invoke(Runtime.getRuntime(), clazz, dllPath); method.setAccessible(accessible); - log.info("成功加载dll:"+ dllPath); + log.info("成功加载dll:" + dllPath); } catch (Exception e) { - throw new RuntimeException("加载dll异常",e); + throw new RuntimeException("加载dll异常", e); } } @@ -38,7 +42,7 @@ * @author: dzd * @date: 2024/9/30 14:31 **/ - public static synchronized void uploadDll(URLClassLoader classLoader) { + public static synchronized void unloadDll(URLClassLoader classLoader) { try { Field field = ClassLoader.class.getDeclaredField("nativeLibraries"); field.setAccessible(true); @@ -60,7 +64,7 @@ log.info("成功卸载dll:" + name); } } catch (Exception e) { - throw new RuntimeException("卸载dll异常",e); + throw new RuntimeException("卸载dll异常", e); } } @@ -69,7 +73,7 @@ * @author: dzd * @date: 2024/9/30 14:52 **/ - public static synchronized void uploadDllName(URLClassLoader classLoader,String dllName) { + public static synchronized void unloadDllName(URLClassLoader classLoader, String dllName) { try { Field field = ClassLoader.class.getDeclaredField("nativeLibraries"); field.setAccessible(true); @@ -93,7 +97,7 @@ log.info("成功卸载dll:" + name); } } catch (Exception e) { - throw new RuntimeException("卸载dll异常",e); + throw new RuntimeException("卸载dll异常", e); } } @@ -105,24 +109,102 @@ public static synchronized URLClassLoader loadJar(String jarPath) { File jarFile = new File(jarPath); if (!jarFile.exists()) { - throw new RuntimeException("jar沒有找到!"); + throw new RuntimeException("jar沒有找到!"+jarPath); } else { try { - URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()}); - log.info("成功加载jar包:"+ jarFile.getAbsolutePath()); + // 设置classloader的patent为null,限制使用双亲委派,防止其他classloader找到class,导致dll加载到其他classloader + URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()},null,null); + log.info("成功加载jar包:" + jarFile.getAbsolutePath()); return urlClassLoader; } catch (Exception e) { - throw new RuntimeException("加载jar异常",e); + throw new RuntimeException("加载jar异常", e); } } } - public static synchronized void uploadJar(URLClassLoader urlClassLoader) { + public static synchronized void unloadJar(URLClassLoader urlClassLoader) { try { urlClassLoader.close(); log.info("成功卸载jar包。"); } catch (Exception e) { - throw new RuntimeException("卸载jar异常",e); + throw new RuntimeException("卸载jar异常", e); } } + + public static synchronized void addClassLoaderCache(String projectId, URLClassLoader urlClassLoader) { + classLoaderCache.put(projectId, urlClassLoader); + } + + public static synchronized URLClassLoader getClassLoader(String projectId) { + return classLoaderCache.get(projectId); + } + + public static synchronized void removeClassLoaderCache(String projectId) { + if (classLoaderCache.containsKey(projectId)) { + URLClassLoader urlClassLoader = classLoaderCache.get(projectId); + unloadDll(urlClassLoader); + unloadJar(urlClassLoader); + classLoaderCache.remove(projectId); + } + } + + public static void removeOldFile(String bakPath,String projectId) { + File dir = new File(bakPath); + if (dir.exists() && dir.isDirectory()) { + File[] files = dir.listFiles(); + if (null != files && files.length > 0) { + for (File file : files) { + if (file.getName().startsWith(projectId)) { + file.delete(); + } + } + } + } + } + + /** + * @description: 项目启动加载已发布的dll和jar + * @author: dzd + * @date: 2024/10/10 11:58 + **/ + public static void loadProjectPublish(String bakPath) { + File dir = new File(bakPath); + if (dir.exists() && dir.isDirectory()) { + File[] files = dir.listFiles(); + if (null != files && files.length > 0) { + for (File file : files) { + String fileName = file.getName(); + if (fileName.endsWith(".jar")) { + String[] split = fileName.substring(0,fileName.length() - 4).split(MdkConstant.SPLIT); + String projectId = split[0]; + String historyId = split[1]; + + String jarFilePath = bakPath + File.separator + projectId + MdkConstant.SPLIT + historyId + ".jar"; + String dllFilePath = bakPath + File.separator + projectId + MdkConstant.SPLIT + historyId + ".dll"; + + if (FileUtil.exist(jarFilePath) && FileUtil.exist(dllFilePath)) { + URLClassLoader urlClassLoader = null; + try { + // 加载新的jar + urlClassLoader = loadJar(jarFilePath); + } catch (Exception e) { + throw new RuntimeException("加载jar异常",e); + } + + try { + // 加载新的dll + loadDll(urlClassLoader.loadClass("iail.mdk.model.common.Environment"),dllFilePath); + } catch (Exception e) { + unloadJar(urlClassLoader); + throw new RuntimeException("加载dll异常",e); + } + // 都加载成功后加入缓存 + addClassLoaderCache(projectId,urlClassLoader); + } + } + } + } + } + + } } 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 6141714..81ae60c 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 @@ -104,8 +104,8 @@ return error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),"运行异常"); } finally { if (classLoader != null) { - DllUtils.uploadDll(classLoader); - DllUtils.uploadJar(classLoader); + DllUtils.unloadDll(classLoader); + DllUtils.unloadJar(classLoader); } System.gc(); } diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java index f7c2e75..8f8ebed 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/controller/admin/MpkFileController.java @@ -125,8 +125,13 @@ @PostMapping("/upload") @Operation(summary = "python文件上传") - public CommonResult<Map<String,String>> importExcel(@RequestParam("file") MultipartFile file) throws Exception { + public CommonResult<Map<String,String>> upload(@RequestParam("file") MultipartFile file) throws Exception { Map<String,String> result = mpkFileService.savePyFile(file); return success(result); } + + @PostMapping("/publish") + public CommonResult<String> publish(@RequestBody Map<String, Object> params) { + return mpkFileService.publish(params); + } } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MpkFileService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MpkFileService.java index 53da080..b33499c 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MpkFileService.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/MpkFileService.java @@ -1,6 +1,7 @@ package com.iailab.module.model.mpk.service; import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; import com.iailab.framework.common.service.BaseService; import com.iailab.module.model.mpk.dto.MpkFileDTO; import com.iailab.module.model.mpk.entity.MpkFileEntity; @@ -34,4 +35,6 @@ byte[] packageModel(List<String> ids,String projectId,String projectName,String fileName,String log,String version) throws IOException, InterruptedException; Map<String,String> savePyFile(MultipartFile file) throws IOException; + + CommonResult<String> publish(Map<String, Object> params); } \ No newline at end of file diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java index a33aa2e..c46b3df 100644 --- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/service/impl/MpkFileServiceImpl.java @@ -8,12 +8,14 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.iailab.framework.common.page.PageData; +import com.iailab.framework.common.pojo.CommonResult; import com.iailab.framework.common.service.impl.BaseServiceImpl; import com.iailab.framework.common.util.date.DateUtils; import com.iailab.framework.common.util.object.ConvertUtils; import com.iailab.framework.security.core.util.SecurityFrameworkUtils; import com.iailab.module.infra.api.config.ConfigApi; 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.GenUtils; import com.iailab.module.model.mpk.dao.MpkFileDao; import com.iailab.module.model.mpk.dto.GeneratorCodeHistoryDTO; @@ -36,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.*; +import java.net.URLClassLoader; import java.nio.file.Files; import java.util.*; import java.util.stream.Collectors; @@ -368,6 +371,16 @@ //生成dll文件 String dllSavePath = dirPath.getAbsolutePath() + File.separator + MdkConstant.LIBS + File.separator + "IAIL.MDK.Mid.Jni.dll"; createDllFile(dirPath.getAbsolutePath(),cppFilePaths,dllSavePath); + // 打包历史id + String historyId = UUID.randomUUID().toString(); + //备份dll,发布时使用 + File dllFile = new File(dllSavePath); + if (dllFile.exists()) { + File dllBakFile = new File(mpkBakFilePath + File.separator + projectId + MdkConstant.SPLIT + historyId + ".dll"); + FileUtil.copy(dllFile, dllBakFile, true); + }else { + log.error("dll文件不存在,无法备份。" + dllSavePath); + } //utils + env java文件 File utilsJavaFile = new File(dirPath.getAbsolutePath() + File.separator + "IAILMDK" + File.separator + "iail" + File.separator + "mdk" + File.separator + "model" + File.separator + "utils" + File.separator + "AlgsUtils.java"); @@ -383,10 +396,18 @@ // 删除java源文件 deleteJavaFile(javaFilePaths); // 打jar包 - pkgJar(dirPath.getAbsolutePath()); + String jarSavePath = pkgJar(dirPath.getAbsolutePath()); + //备份jar包,发布时使用 + File jarFile = new File(jarSavePath); + if (jarFile.exists()) { + File jarBakFile = new File(mpkBakFilePath + File.separator + projectId + MdkConstant.SPLIT + historyId + ".jar"); + FileUtil.copy(jarFile, jarBakFile, true); + }else { + log.error("jar文件不存在,无法备份。" + jarSavePath); + } + // 本次更新日志 ProjectPackageHistoryDTO dto = new ProjectPackageHistoryDTO(); - String historyId = UUID.randomUUID().toString(); dto.setId(historyId); dto.setProjectId(projectId); dto.setFileName(zipFileName); @@ -470,6 +491,57 @@ return result; } + @Override + public CommonResult<String> publish(Map<String, Object> params) { + String historyId = (String) params.get("historyId"); + String projectId = (String) params.get("projectId"); + + // 判断新的dll和jar文件是否存在 + String jarFileBakPath = mpkBakFilePath + File.separator + projectId + MdkConstant.SPLIT + historyId + ".jar"; + String dllFileBakPath = mpkBakFilePath + File.separator + projectId + MdkConstant.SPLIT + historyId + ".dll"; + if (!FileUtil.exist(jarFileBakPath)) { + throw new RuntimeException("jar文件不存在," + jarFileBakPath); + } + if (!FileUtil.exist(dllFileBakPath)) { + throw new RuntimeException("dll文件不存在" + dllFileBakPath); + } + + try { + // 卸载之前的dll和jar + DllUtils.removeClassLoaderCache(projectId); + // 删除之前的dll和jar备份文件 + DllUtils.removeOldFile(mpkBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH,projectId); + } catch (Exception e) { + throw new RuntimeException("卸载之前的dll和jar异常",e); + } + + // 备份新的dll和jar + String jarFilePath = mpkBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH + File.separator + projectId + MdkConstant.SPLIT + historyId + ".jar"; + String dllFilePath = mpkBakFilePath + File.separator + MdkConstant.PROJECT_PUBLISH + File.separator + projectId + MdkConstant.SPLIT + historyId + ".dll"; + FileUtil.copy(jarFileBakPath,jarFilePath,true); + FileUtil.copy(dllFileBakPath,dllFilePath,true); + + URLClassLoader urlClassLoader = null; + try { + // 加载新的jar + urlClassLoader = DllUtils.loadJar(jarFilePath); + } catch (Exception e) { + throw new RuntimeException("加载新的jar异常",e); + } + + try { + // 加载新的dll + DllUtils.loadDll(urlClassLoader.loadClass("iail.mdk.model.common.Environment"),dllFilePath); + } catch (Exception e) { + DllUtils.unloadJar(urlClassLoader); + throw new RuntimeException("加载新的dll异常",e); + } + // 都加载成功后加入缓存 + DllUtils.addClassLoaderCache(projectId,urlClassLoader); + + return CommonResult.success(); + } + private void createLog(String projectId, String projectName, String dirPath, ProjectPackageHistoryDTO dto, String version) throws IOException { Map<String, Object> map = new HashMap<>(); map.put("projectId", projectId); -- Gitblit v1.9.3