rasa:rasa服务状态监听功能

dev_v1.0.1
xueqingkun 2 years ago
parent 3e553cffa7
commit 9f5312dcd6

@ -3,18 +3,20 @@ package com.supervision.model;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.supervision.handler.StringListTypeHandler;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
/** /**
* *
* @TableName vp_rasa_model_info * @TableName vp_rasa_model_info
*/ */
@TableName(value ="vp_rasa_model_info") @TableName(value ="vp_rasa_model_info" ,autoResultMap = true)
@Data @Data
@ApiModel @ApiModel
public class RasaModelInfo implements Serializable { public class RasaModelInfo implements Serializable {
@ -56,6 +58,11 @@ public class RasaModelInfo implements Serializable {
@ApiModelProperty("启动状态") @ApiModelProperty("启动状态")
private Integer serverStatus; private Integer serverStatus;
@ApiModelProperty("执行shell命令")
@TableField(typeHandler = StringListTypeHandler.class)
private List<String> cmd;
/** /**
* ID * ID

@ -2,7 +2,6 @@ package com.supervision.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.model.RasaModelInfo; import com.supervision.model.RasaModelInfo;
import sun.reflect.generics.tree.VoidDescriptor;
import java.util.List; import java.util.List;
@ -15,4 +14,5 @@ public interface RasaModeService extends IService<RasaModelInfo> {
List<Integer> listActivePort(); List<Integer> listActivePort();
List<RasaModelInfo> listActive();
} }

@ -46,4 +46,10 @@ public class RasaModeServiceImpl extends ServiceImpl<RasaModelInfoMapper,RasaMod
LambdaQueryChainWrapper<RasaModelInfo> queryWrapper = super.lambdaQuery().eq(RasaModelInfo::getServerStatus, "1"); LambdaQueryChainWrapper<RasaModelInfo> queryWrapper = super.lambdaQuery().eq(RasaModelInfo::getServerStatus, "1");
return queryWrapper.list().stream().map(RasaModelInfo::getPort).collect(Collectors.toList()); return queryWrapper.list().stream().map(RasaModelInfo::getPort).collect(Collectors.toList());
} }
@Override
public List<RasaModelInfo> listActive() {
LambdaQueryChainWrapper<RasaModelInfo> queryWrapper = super.lambdaQuery().eq(RasaModelInfo::getServerStatus, "1");
return queryWrapper.list();
}
} }

@ -12,6 +12,7 @@
<result property="tranStatus" column="tran_status" jdbcType="INTEGER"/> <result property="tranStatus" column="tran_status" jdbcType="INTEGER"/>
<result property="serverStatus" column="server_status" jdbcType="INTEGER"/> <result property="serverStatus" column="server_status" jdbcType="INTEGER"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/> <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="cmd" column="cmd" jdbcType="ARRAY" typeHandler="com.supervision.handler.StringListTypeHandler"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/> <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/> <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
@ -19,7 +20,7 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id,model_id,description, 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 update_user_id,update_time
</sql> </sql>

@ -6,8 +6,10 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType; import org.springframework.context.annotation.FilterType;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication @SpringBootApplication
@EnableScheduling
@MapperScan(basePackages = {"com.supervision.**.mapper"}) @MapperScan(basePackages = {"com.supervision.**.mapper"})
@ComponentScan(basePackages = {"com.supervision"},excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {WebConfig.class})) @ComponentScan(basePackages = {"com.supervision"},excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {WebConfig.class}))
public class VirtualPatientRasaApplication { public class VirtualPatientRasaApplication {

@ -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";
}

@ -1,9 +1,11 @@
package com.supervision.rasa.controller; package com.supervision.rasa.controller;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.supervision.rasa.constant.RasaConstant;
import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo; import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo;
import com.supervision.rasa.service.RasaCmdService; import com.supervision.rasa.service.RasaCmdService;
import com.supervision.exception.BusinessException; import com.supervision.exception.BusinessException;
import com.supervision.rasa.service.RasaModelManager;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -47,7 +49,7 @@ public class RasaCmdController {
throw new BusinessException("modelId参数不能为空! "); throw new BusinessException("modelId参数不能为空! ");
} }
String outString = rasaCmdService.runExec(argument); 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); throw new BusinessException("任务执行异常。详细日志:"+outString);
} }
return outString; return outString;
@ -55,12 +57,13 @@ public class RasaCmdController {
} }
private final RasaModelManager rasaModelManager;
@ApiOperation("执行启动shell命令") @ApiOperation("执行启动shell命令")
@PostMapping("/test") @PostMapping("/test")
public String test(@RequestBody RasaCmdArgumentVo argument) throws ExecutionException, InterruptedException, TimeoutException { public String test(@RequestBody RasaCmdArgumentVo argument) throws ExecutionException, InterruptedException, TimeoutException {
rasaCmdService.test(); rasaModelManager.wakeUpInterruptServer();
return " dd"; return " dd";

@ -4,9 +4,7 @@ package com.supervision.rasa.controller;
import com.supervision.rasa.service.RasaFileService; import com.supervision.rasa.service.RasaFileService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import jdk.internal.org.objectweb.asm.tree.FieldInsnNode;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;

@ -3,8 +3,10 @@ package com.supervision.rasa.service;
import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo; import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.function.Predicate;
public interface RasaCmdService { public interface RasaCmdService {
@ -12,6 +14,8 @@ public interface RasaCmdService {
String runExec( RasaCmdArgumentVo argument) throws ExecutionException, InterruptedException, TimeoutException; String runExec( RasaCmdArgumentVo argument) throws ExecutionException, InterruptedException, TimeoutException;
List<String> execCmd(List<String> cmds, Predicate<String> endPredicate, long timeOut) throws InterruptedException, ExecutionException, TimeoutException;
void test(); void test();
} }

@ -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<RasaModelInfo> rasaModelInfos = rasaModeService.listActive();
List<RasaModelInfo> 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<String> 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<String> messageList){
return containKey(messageList,RasaConstant.RUN_SUCCESS_MESSAGE);
}
private boolean containKey(List<String> 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));
}
}

@ -5,6 +5,7 @@ import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.supervision.model.RasaModelInfo; import com.supervision.model.RasaModelInfo;
import com.supervision.rasa.config.ThreadPoolExecutorConfig; import com.supervision.rasa.config.ThreadPoolExecutorConfig;
import com.supervision.rasa.constant.RasaConstant;
import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo; import com.supervision.rasa.pojo.vo.RasaCmdArgumentVo;
import com.supervision.rasa.service.RasaCmdService; import com.supervision.rasa.service.RasaCmdService;
import com.supervision.rasa.util.PortUtil; import com.supervision.rasa.util.PortUtil;
@ -54,8 +55,6 @@ public class RasaCmdServiceImpl implements RasaCmdService {
private final RasaModeService rasaModeService; 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 @Override
@Transactional @Transactional
@ -63,11 +62,12 @@ public class RasaCmdServiceImpl implements RasaCmdService {
String domain = dataPath+"domain.yml"; String domain = dataPath+"domain.yml";
List<String> cmds = ListUtil.toList(shellEnv, trainShell,config,dataPath,domain,modelsPath); List<String> cmds = ListUtil.toList(shellEnv, trainShell,config,dataPath,domain,modelsPath);
cmds.add(argument.getFixedModelName()); cmds.add(argument.getFixedModelName());
log.info("trainExec cmd : {}",StrUtil.join(" ",cmds)); log.info("trainExec cmd : {}",StrUtil.join(" ",cmds));
List<String> outMessage = execCmd(cmds, s -> false, 300); List<String> outMessage = execCmd(cmds, s -> StrUtil.isNotBlank(s) && s.contains(RasaConstant.TRAN_SUCCESS_MESSAGE), 300);
//保存 模型信息 //保存 模型信息
RasaModelInfo rasaModelInfo = new RasaModelInfo(); RasaModelInfo rasaModelInfo = new RasaModelInfo();
@ -95,13 +95,14 @@ public class RasaCmdServiceImpl implements RasaCmdService {
log.info("runExec cmd : {}",StrUtil.join(" ",cmds)); log.info("runExec cmd : {}",StrUtil.join(" ",cmds));
List<String> outMessageList = execCmd(cmds, s -> StrUtil.isNotBlank(s) && s.contains(RUN_SUCCESS_MESSAGE), 300); List<String> outMessageList = execCmd(cmds, s -> StrUtil.isNotBlank(s) && s.contains(RasaConstant.RUN_SUCCESS_MESSAGE), 300);
// 3. 更新模型信息 // 3. 更新模型信息
RasaModelInfo rasaModelInfo = new RasaModelInfo(); RasaModelInfo rasaModelInfo = new RasaModelInfo();
rasaModelInfo.setModelId(argument.getModelId()); rasaModelInfo.setModelId(argument.getModelId());
rasaModelInfo.setPort(port); rasaModelInfo.setPort(port);
rasaModelInfo.setServerStatus(runIsSuccess(outMessageList)?1:0); rasaModelInfo.setServerStatus(runIsSuccess(outMessageList)?1:0);
rasaModelInfo.setCmd(ListUtil.toList(shellEnv, runShell,mPath,endpoints));
rasaModeService.saveOrUpdateByModelId(rasaModelInfo); rasaModeService.saveOrUpdateByModelId(rasaModelInfo);
return String.join("\r\n",outMessageList); return String.join("\r\n",outMessageList);
@ -117,7 +118,7 @@ public class RasaCmdServiceImpl implements RasaCmdService {
} }
private List<String> execCmd(List<String> cmds, Predicate<String> endPredicate, long timeOut) throws InterruptedException, ExecutionException, TimeoutException { public List<String> execCmd(List<String> cmds, Predicate<String> endPredicate, long timeOut) throws InterruptedException, ExecutionException, TimeoutException {
ProcessBuilder processBuilder = new ProcessBuilder(cmds); ProcessBuilder processBuilder = new ProcessBuilder(cmds);
processBuilder.directory(new File(shellWork)); processBuilder.directory(new File(shellWork));
processBuilder.redirectErrorStream(true); processBuilder.redirectErrorStream(true);
@ -139,7 +140,7 @@ public class RasaCmdServiceImpl implements RasaCmdService {
} }
} }
bufferedReader.close(); bufferedReader.close();
return new ArrayList<>(); return outString;
}); });
return future.get(timeOut, TimeUnit.SECONDS); return future.get(timeOut, TimeUnit.SECONDS);
@ -150,13 +151,13 @@ public class RasaCmdServiceImpl implements RasaCmdService {
private boolean trainIsSuccess(List<String> messageList){ private boolean trainIsSuccess(List<String> messageList){
return containKey(messageList,TRAN_SUCCESS_MESSAGE); return containKey(messageList,RasaConstant.TRAN_SUCCESS_MESSAGE);
} }
private boolean runIsSuccess(List<String> messageList){ private boolean runIsSuccess(List<String> messageList){
return containKey(messageList,RUN_SUCCESS_MESSAGE); return containKey(messageList,RasaConstant.RUN_SUCCESS_MESSAGE);
} }
private boolean containKey(List<String> messageList,String keyWord){ private boolean containKey(List<String> messageList,String keyWord){

@ -19,6 +19,8 @@ rasa:
train-shell: /home/rasa_manage/train.sh train-shell: /home/rasa_manage/train.sh
run-shell: /home/rasa_manage/run.sh run-shell: /home/rasa_manage/run.sh
url: 192.168.10.137:{}/webhooks/rest/webhook url: 192.168.10.137:{}/webhooks/rest/webhook
wakeup:
cron: 0 */10 * * * ? #每十分钟执行一次
spring: spring:
profiles: profiles:
active: dev active: dev

Loading…
Cancel
Save