diff --git a/virtual-patient-rasa/src/main/java/com/superversion/rasa/config/ThreadPoolExecutorConfig.java b/virtual-patient-rasa/src/main/java/com/superversion/rasa/config/ThreadPoolExecutorConfig.java new file mode 100644 index 00000000..1ab09e89 --- /dev/null +++ b/virtual-patient-rasa/src/main/java/com/superversion/rasa/config/ThreadPoolExecutorConfig.java @@ -0,0 +1,28 @@ +package com.superversion.rasa.config; + +import java.util.concurrent.*; + +public class ThreadPoolExecutorConfig { + + private volatile static ThreadPoolExecutor instance = null; + + private ThreadPoolExecutorConfig(){} + + + public static ThreadPoolExecutor getInstance() { + if (instance == null) { + synchronized (ThreadPoolExecutorConfig.class) { // 加锁 + if (instance == null) { + int corePoolSize = 5; + int maximumPoolSize = 10; + long keepAliveTime = 100; + BlockingQueue workQueue = new ArrayBlockingQueue<>(20); + RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.AbortPolicy(); + instance = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, rejectedExecutionHandler); + } + } + } + return instance; + } + +} diff --git a/virtual-patient-rasa/src/main/java/com/superversion/rasa/controller/RasaCmdController.java b/virtual-patient-rasa/src/main/java/com/superversion/rasa/controller/RasaCmdController.java index be99ec2d..34eeaf94 100644 --- a/virtual-patient-rasa/src/main/java/com/superversion/rasa/controller/RasaCmdController.java +++ b/virtual-patient-rasa/src/main/java/com/superversion/rasa/controller/RasaCmdController.java @@ -1,20 +1,15 @@ package com.superversion.rasa.controller; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ZipUtil; -import com.superversion.rasa.service.RasaFileService; +import com.superversion.rasa.pojo.vo.RasaArgument; +import com.superversion.rasa.service.RasaCmdService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.bind.annotation.*; import java.io.*; -import java.nio.charset.Charset; +import java.util.concurrent.*; @Api(tags = "rasa文件保存") @RestController @@ -23,14 +18,21 @@ import java.nio.charset.Charset; public class RasaCmdController { @Autowired - private RasaFileService rasaFileService; + private RasaCmdService rasaCmdService; - @ApiOperation("接受并保存rasa文件") - @PostMapping("/exec") - public String cmdExec(@RequestParam("file") MultipartFile file){ + @ApiOperation("执行训练shell命令") + @PostMapping("/trainExec") + public String trainExec(@RequestBody RasaArgument argument) throws IOException, ExecutionException, InterruptedException, TimeoutException { + return rasaCmdService.trainExec(argument); - return "ok"; + } + + @ApiOperation("执行启动shell命令") + @PostMapping("/runExec") + public String runExec(@RequestBody RasaArgument argument) throws ExecutionException, InterruptedException, TimeoutException { + + return rasaCmdService.runExec(argument); } diff --git a/virtual-patient-rasa/src/main/java/com/superversion/rasa/pojo/vo/RasaArgument.java b/virtual-patient-rasa/src/main/java/com/superversion/rasa/pojo/vo/RasaArgument.java new file mode 100644 index 00000000..8d719cc0 --- /dev/null +++ b/virtual-patient-rasa/src/main/java/com/superversion/rasa/pojo/vo/RasaArgument.java @@ -0,0 +1,17 @@ +package com.superversion.rasa.pojo.vo; + +import lombok.Data; + +@Data +public class RasaArgument { + + private String config; + private String data; + private String domain; + private String out; + private String fixedModelName;//fixed-model-name + private String enableApi;//enable-api + private String endpoints; + private String port; + +} diff --git a/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/RasaCmdService.java b/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/RasaCmdService.java index 9fa7b132..470e975a 100644 --- a/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/RasaCmdService.java +++ b/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/RasaCmdService.java @@ -1,4 +1,14 @@ package com.superversion.rasa.service; +import com.superversion.rasa.pojo.vo.RasaArgument; + +import java.io.IOException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; + public interface RasaCmdService { + + String trainExec(RasaArgument argument) throws IOException, ExecutionException, InterruptedException, TimeoutException; + + String runExec( RasaArgument argument) throws ExecutionException, InterruptedException, TimeoutException; } diff --git a/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaCmdServiceImpl.java b/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaCmdServiceImpl.java index 42fde808..a1830732 100644 --- a/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaCmdServiceImpl.java +++ b/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaCmdServiceImpl.java @@ -1,33 +1,106 @@ package com.superversion.rasa.service.impl; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.StrUtil; +import com.superversion.rasa.config.ThreadPoolExecutorConfig; +import com.superversion.rasa.pojo.vo.RasaArgument; import com.superversion.rasa.service.RasaCmdService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.Charset; +import java.io.*; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; +import java.util.function.Predicate; +@Service +@Slf4j +@RequiredArgsConstructor public class RasaCmdServiceImpl implements RasaCmdService { - public static void main(String[] args) throws IOException, InterruptedException { - Runtime runtime = Runtime.getRuntime(); - Process process = runtime.exec(" cmd /c ls "); - BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName("GBK"))); - String lineMes; - while ((lineMes = br.readLine()) != null){ - System.out.println(lineMes);// 打印输出信息 - } + @Value("${rasa.models-path}") + private String modelsPath; + @Value("${rasa.endpoints}") + private String endpoints; + @Value("${rasa.config}") + private String config; - //检查命令是否执行失败。 - if (process.waitFor() != 0) { - if (process.exitValue() == 1)//0表示正常结束,1:非正常结束 - System.err.println("命令执行失败!"); - } - br.close(); + @Value("${rasa.data-path}") + private String dataPath; + @Value("${rasa.shell-env:/bin/bash}") + private String shellEnv; + + @Value("${rasa.train-shell}") + private String trainShell; + + @Value("${rasa.run-shell}") + private String runShell; + + @Value("${rasa.shell.work:/home/rasa_manage/}") + private String shellWork; + + @Override + public String trainExec(RasaArgument argument) throws ExecutionException, InterruptedException, TimeoutException { + + 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)); + System.out.println("trainExec cmd sout:"+StrUtil.join(" ",cmds)); + return String.join("\r\n",execCmd(cmds,s->false,90)); + } + + + + @Override + public String runExec(RasaArgument argument) throws ExecutionException, InterruptedException, TimeoutException { + + + String mPath = modelsPath+argument.getFixedModelName()+".tar.gz"; + List cmds = ListUtil.toList(shellEnv, runShell,mPath,endpoints,argument.getPort()); + + log.info("runExec cmd : {}",StrUtil.join(" ",cmds)); + System.out.println("runExec cmd sout:"+StrUtil.join(" ",cmds)); + return String.join("\r\n",execCmd(cmds,s-> StrUtil.isNotBlank(s)&& s.contains("Rasa server is up and running"),90)); + } + + + + private 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); // 合并标准输出和错误输出 + + ThreadPoolExecutor instance = ThreadPoolExecutorConfig.getInstance(); + Future> future = instance.submit(() -> { + Process process = processBuilder.start(); // 启动进程 + InputStream inputStream = process.getInputStream(); // 获取进程的输出流 + Reader reader = new InputStreamReader(inputStream, "UTF-8"); + BufferedReader bufferedReader = new BufferedReader(reader); + List outString = new ArrayList<>(); + String resultLines = bufferedReader.readLine(); + while(resultLines != null) { + resultLines = bufferedReader.readLine(); // 读取下一行 + log.info("resultLines:{}",resultLines); + if (endPredicate.test(resultLines)){ + break; + } + outString.add(resultLines); + } + bufferedReader.close(); + return outString; + }); + + return future.get(timeOut, TimeUnit.SECONDS); } + } diff --git a/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaFileServiceImpl.java b/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaFileServiceImpl.java index 9237b520..d1927eb3 100644 --- a/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaFileServiceImpl.java +++ b/virtual-patient-rasa/src/main/java/com/superversion/rasa/service/impl/RasaFileServiceImpl.java @@ -18,12 +18,13 @@ import java.io.IOException; public class RasaFileServiceImpl implements RasaFileService { - @Value("${rasa.file-path:/home/rasa}") + @Value("${rasa.data-path:/home/rasa/}") private String rasaFilePath; @Value("${rasa.file-name:rasa.zip}") private String rasaFileName; + @Override public void saveRasaFile(MultipartFile file) throws IOException { @@ -35,7 +36,7 @@ public class RasaFileServiceImpl implements RasaFileService { String suffix = "_back"; String rasaFullPath = String.join(File.separator, rasaFilePath, rasaFileName); - String rasaBackFullPath = String.join(File.separator, rasaFilePath, rasaFileName + suffix); + String rasaBackFullPath = rasaFilePath+rasaFileName + suffix; //1.检查路径下是否存在文件 File oldFile = new File(rasaFullPath); diff --git a/virtual-patient-rasa/src/main/resources/application.yml b/virtual-patient-rasa/src/main/resources/application.yml index 87c52e9a..c86024bf 100644 --- a/virtual-patient-rasa/src/main/resources/application.yml +++ b/virtual-patient-rasa/src/main/resources/application.yml @@ -4,4 +4,9 @@ server: context-path: / rasa: - file-path: F:\tmp \ No newline at end of file + data-path: /rasa/v3_jiazhuangxian/ # 文件解压后存放位置 + models-path: /rasa/models/ + endpoints: /rasa/endpoints.yml # 启动的配置项,应该是写在配置文件里面 + config: /rasa/config-local.yml # 启动rasa需要的配置文件,在配置文件中配置 + train-shell: /home/rasa_manage/train.sh + run-shell: /home/rasa_manage/run.sh \ No newline at end of file