diff --git a/virtual-patient-model/src/main/java/com/supervision/model/RasaModelInfo.java b/virtual-patient-model/src/main/java/com/supervision/model/RasaModelInfo.java index 65915521..fd3b4dd2 100644 --- a/virtual-patient-model/src/main/java/com/supervision/model/RasaModelInfo.java +++ b/virtual-patient-model/src/main/java/com/supervision/model/RasaModelInfo.java @@ -3,18 +3,20 @@ package com.supervision.model; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.supervision.handler.StringListTypeHandler; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; +import java.util.List; /** * 诊断进程表 * @TableName vp_rasa_model_info */ -@TableName(value ="vp_rasa_model_info") +@TableName(value ="vp_rasa_model_info" ,autoResultMap = true) @Data @ApiModel public class RasaModelInfo implements Serializable { @@ -56,6 +58,11 @@ public class RasaModelInfo implements Serializable { @ApiModelProperty("启动状态") private Integer serverStatus; + @ApiModelProperty("执行shell命令") + @TableField(typeHandler = StringListTypeHandler.class) + private List cmd; + + /** * 创建人ID diff --git a/virtual-patient-model/src/main/java/com/supervision/service/RasaModeService.java b/virtual-patient-model/src/main/java/com/supervision/service/RasaModeService.java index ef825890..7eefd5c4 100644 --- a/virtual-patient-model/src/main/java/com/supervision/service/RasaModeService.java +++ b/virtual-patient-model/src/main/java/com/supervision/service/RasaModeService.java @@ -2,7 +2,6 @@ package com.supervision.service; import com.baomidou.mybatisplus.extension.service.IService; import com.supervision.model.RasaModelInfo; -import sun.reflect.generics.tree.VoidDescriptor; import java.util.List; @@ -15,4 +14,5 @@ public interface RasaModeService extends IService { List listActivePort(); + List listActive(); } diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/RasaModeServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/RasaModeServiceImpl.java index 26a283c7..c2cc40db 100644 --- a/virtual-patient-model/src/main/java/com/supervision/service/impl/RasaModeServiceImpl.java +++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/RasaModeServiceImpl.java @@ -46,4 +46,10 @@ public class RasaModeServiceImpl extends ServiceImpl queryWrapper = super.lambdaQuery().eq(RasaModelInfo::getServerStatus, "1"); return queryWrapper.list().stream().map(RasaModelInfo::getPort).collect(Collectors.toList()); } + + @Override + public List listActive() { + LambdaQueryChainWrapper queryWrapper = super.lambdaQuery().eq(RasaModelInfo::getServerStatus, "1"); + return queryWrapper.list(); + } } diff --git a/virtual-patient-model/src/main/resources/mapper/RasaModelInfoMapper.xml b/virtual-patient-model/src/main/resources/mapper/RasaModelInfoMapper.xml index 056f2076..e40299ad 100644 --- a/virtual-patient-model/src/main/resources/mapper/RasaModelInfoMapper.xml +++ b/virtual-patient-model/src/main/resources/mapper/RasaModelInfoMapper.xml @@ -12,6 +12,7 @@ + @@ -19,7 +20,7 @@ id,model_id,description, - port,tran_status,server_status,create_user_id,create_time, + port,tran_status,server_status,cmd,create_user_id,create_time, update_user_id,update_time diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java index 07569680..3133aa8b 100644 --- a/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/VirtualPatientRasaApplication.java @@ -6,8 +6,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; +import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication +@EnableScheduling @MapperScan(basePackages = {"com.supervision.**.mapper"}) @ComponentScan(basePackages = {"com.supervision"},excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {WebConfig.class})) public class VirtualPatientRasaApplication { diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/constant/RasaConstant.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/constant/RasaConstant.java new file mode 100644 index 00000000..40119bf5 --- /dev/null +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/constant/RasaConstant.java @@ -0,0 +1,7 @@ +package com.supervision.rasa.constant; + +public class RasaConstant { + + public static final String TRAN_SUCCESS_MESSAGE = "Your Rasa model is trained and saved at"; + public static final String RUN_SUCCESS_MESSAGE = "Rasa server is up and running"; +} diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaCmdController.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaCmdController.java index 9939d41b..aad2ff4b 100644 --- a/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaCmdController.java +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaCmdController.java @@ -1,9 +1,11 @@ package com.supervision.rasa.controller; import cn.hutool.core.util.StrUtil; +import com.supervision.rasa.constant.RasaConstant; import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo; import com.supervision.rasa.service.RasaCmdService; import com.supervision.exception.BusinessException; +import com.supervision.rasa.service.RasaModelManager; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -47,7 +49,7 @@ public class RasaCmdController { throw new BusinessException("modelId参数不能为空! "); } String outString = rasaCmdService.runExec(argument); - if (StrUtil.isEmptyIfStr(outString) || !outString.contains("Rasa server is up and running")){ + if (StrUtil.isEmptyIfStr(outString) || !outString.contains(RasaConstant.RUN_SUCCESS_MESSAGE)){ throw new BusinessException("任务执行异常。详细日志:"+outString); } return outString; @@ -55,12 +57,13 @@ public class RasaCmdController { } + private final RasaModelManager rasaModelManager; @ApiOperation("执行启动shell命令") @PostMapping("/test") public String test(@RequestBody RasaCmdArgumentVo argument) throws ExecutionException, InterruptedException, TimeoutException { - rasaCmdService.test(); + rasaModelManager.wakeUpInterruptServer(); return " dd"; diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java index bd51f47a..2c3b0394 100644 --- a/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/controller/RasaFileController.java @@ -4,9 +4,7 @@ package com.supervision.rasa.controller; import com.supervision.rasa.service.RasaFileService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import jdk.internal.org.objectweb.asm.tree.FieldInsnNode; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/RasaCmdService.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/RasaCmdService.java index 51f4b10e..354a5f41 100644 --- a/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/RasaCmdService.java +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/RasaCmdService.java @@ -3,8 +3,10 @@ package com.supervision.rasa.service; import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo; import java.io.IOException; +import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; +import java.util.function.Predicate; public interface RasaCmdService { @@ -12,6 +14,8 @@ public interface RasaCmdService { String runExec( RasaCmdArgumentVo argument) throws ExecutionException, InterruptedException, TimeoutException; + + List execCmd(List cmds, Predicate endPredicate, long timeOut) throws InterruptedException, ExecutionException, TimeoutException; void test(); } diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/RasaModelManager.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/RasaModelManager.java new file mode 100644 index 00000000..a9e6ca28 --- /dev/null +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/RasaModelManager.java @@ -0,0 +1,95 @@ +package com.supervision.rasa.service; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.supervision.model.RasaModelInfo; +import com.supervision.rasa.constant.RasaConstant; +import com.supervision.rasa.util.PortUtil; +import com.supervision.service.RasaModeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +@Slf4j +@Component +@RequiredArgsConstructor +public class RasaModelManager { + + private final RasaModeService rasaModeService; + + private final RasaCmdService rasaCmdService; + + private boolean wakeUpInterruptServerRunning = false; + + public void wakeUpInterruptServer(){ + + // 1. 查找出记录表中存活的服务 + List rasaModelInfos = rasaModeService.listActive(); + List activeRasaList = rasaModelInfos.stream().filter(info -> CollectionUtil.isNotEmpty(info.getCmd()) && null != info.getPort()).collect(Collectors.toList()); + + if (CollectionUtil.isEmpty(activeRasaList)){ + log.info("wakeUpInterruptService: no rasa service need wake up ..."); + return; + } + + // 2. 重新启动中断的服务 + for (RasaModelInfo rasaModelInfo : activeRasaList) { + if (!PortUtil.portIsActive(rasaModelInfo.getPort())){ + try { + rasaModelInfo.getCmd().add(String.valueOf(rasaModelInfo.getPort())); + List outMessageList = rasaCmdService.execCmd(rasaModelInfo.getCmd(), + s -> StrUtil.isNotBlank(s) && s.contains(RasaConstant.RUN_SUCCESS_MESSAGE), 300); + + if (!runIsSuccess(outMessageList)){ + log.info("wakeUpInterruptServer: restart server port for {} failed,details info : {}",rasaModelInfo.getPort(),String.join("\r\n",outMessageList)); + } + } catch (InterruptedException | ExecutionException | TimeoutException e ) { + log.info("wakeUpInterruptServer: restart server port for {} failed",rasaModelInfo.getPort()); + throw new RuntimeException(e); + } + log.info("wakeUpInterruptServer: restart server port for {} success!",rasaModelInfo.getPort()); + }else { + log.info("wakeUpInterruptServer: port:{} is run..",rasaModelInfo.getPort()); + } + } + } + + + + //默认每十分钟执行一次 + @Scheduled(cron = "${rasa.wakeup.cron:0 */10 * * * ?}") + public void wakeUpInterruptServerScheduled(){ + try { + log.info("wakeUpInterruptServerScheduled: Scheduled is run .... wakeUpInterruptServerRunning is :{}",wakeUpInterruptServerRunning); + if (!wakeUpInterruptServerRunning){ + wakeUpInterruptServerRunning = true; + wakeUpInterruptServer(); + + } + } finally { + wakeUpInterruptServerRunning = false; + } + } + + private boolean runIsSuccess(List messageList){ + + return containKey(messageList,RasaConstant.RUN_SUCCESS_MESSAGE); + } + + private boolean containKey(List messageList,String keyWord){ + + if (CollectionUtil.isEmpty(messageList)){ + return false; + } + if (StrUtil.isEmpty(keyWord)){ + return false; + } + return messageList.stream().anyMatch(s->StrUtil.isNotEmpty(s) && s.contains(keyWord)); + } +} diff --git a/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/impl/RasaCmdServiceImpl.java b/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/impl/RasaCmdServiceImpl.java index ef6effd1..6af6240e 100644 --- a/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/impl/RasaCmdServiceImpl.java +++ b/virtual-patient-rasa/src/main/java/com/supervision/rasa/service/impl/RasaCmdServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; import com.supervision.model.RasaModelInfo; import com.supervision.rasa.config.ThreadPoolExecutorConfig; +import com.supervision.rasa.constant.RasaConstant; import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo; import com.supervision.rasa.service.RasaCmdService; import com.supervision.rasa.util.PortUtil; @@ -54,8 +55,6 @@ public class RasaCmdServiceImpl implements RasaCmdService { private final RasaModeService rasaModeService; - private final String TRAN_SUCCESS_MESSAGE = "Your Rasa model is trained and saved at"; - private final String RUN_SUCCESS_MESSAGE = "Rasa server is up and running"; @Override @Transactional @@ -63,11 +62,12 @@ public class RasaCmdServiceImpl implements RasaCmdService { String domain = dataPath+"domain.yml"; List cmds = ListUtil.toList(shellEnv, trainShell,config,dataPath,domain,modelsPath); + cmds.add(argument.getFixedModelName()); log.info("trainExec cmd : {}",StrUtil.join(" ",cmds)); - List outMessage = execCmd(cmds, s -> false, 300); + List outMessage = execCmd(cmds, s -> StrUtil.isNotBlank(s) && s.contains(RasaConstant.TRAN_SUCCESS_MESSAGE), 300); //保存 模型信息 RasaModelInfo rasaModelInfo = new RasaModelInfo(); @@ -95,13 +95,14 @@ public class RasaCmdServiceImpl implements RasaCmdService { log.info("runExec cmd : {}",StrUtil.join(" ",cmds)); - List outMessageList = execCmd(cmds, s -> StrUtil.isNotBlank(s) && s.contains(RUN_SUCCESS_MESSAGE), 300); + List outMessageList = execCmd(cmds, s -> StrUtil.isNotBlank(s) && s.contains(RasaConstant.RUN_SUCCESS_MESSAGE), 300); // 3. 更新模型信息 RasaModelInfo rasaModelInfo = new RasaModelInfo(); rasaModelInfo.setModelId(argument.getModelId()); rasaModelInfo.setPort(port); rasaModelInfo.setServerStatus(runIsSuccess(outMessageList)?1:0); + rasaModelInfo.setCmd(ListUtil.toList(shellEnv, runShell,mPath,endpoints)); rasaModeService.saveOrUpdateByModelId(rasaModelInfo); return String.join("\r\n",outMessageList); @@ -117,7 +118,7 @@ public class RasaCmdServiceImpl implements RasaCmdService { } - private List execCmd(List cmds, Predicate endPredicate, long timeOut) throws InterruptedException, ExecutionException, TimeoutException { + public List execCmd(List cmds, Predicate endPredicate, long timeOut) throws InterruptedException, ExecutionException, TimeoutException { ProcessBuilder processBuilder = new ProcessBuilder(cmds); processBuilder.directory(new File(shellWork)); processBuilder.redirectErrorStream(true); @@ -139,7 +140,7 @@ public class RasaCmdServiceImpl implements RasaCmdService { } } bufferedReader.close(); - return new ArrayList<>(); + return outString; }); return future.get(timeOut, TimeUnit.SECONDS); @@ -150,13 +151,13 @@ public class RasaCmdServiceImpl implements RasaCmdService { private boolean trainIsSuccess(List messageList){ - return containKey(messageList,TRAN_SUCCESS_MESSAGE); + return containKey(messageList,RasaConstant.TRAN_SUCCESS_MESSAGE); } private boolean runIsSuccess(List messageList){ - return containKey(messageList,RUN_SUCCESS_MESSAGE); + return containKey(messageList,RasaConstant.RUN_SUCCESS_MESSAGE); } private boolean containKey(List messageList,String keyWord){ diff --git a/virtual-patient-rasa/src/main/resources/application.yml b/virtual-patient-rasa/src/main/resources/application.yml index 733a2604..ced9e79b 100644 --- a/virtual-patient-rasa/src/main/resources/application.yml +++ b/virtual-patient-rasa/src/main/resources/application.yml @@ -19,6 +19,8 @@ rasa: train-shell: /home/rasa_manage/train.sh run-shell: /home/rasa_manage/run.sh url: 192.168.10.137:{}/webhooks/rest/webhook + wakeup: + cron: 0 */10 * * * ? #每十分钟执行一次 spring: profiles: active: dev