package com.zt.life.modules.mainPart.async;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.zt.common.servlet.Result;
|
import com.zt.life.modules.mainPart.taskReliability.model.PythonResult;
|
import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.scheduling.annotation.Async;
|
import org.springframework.stereotype.Component;
|
|
import java.io.BufferedReader;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
|
@Component
|
public class PythonLib {
|
private static final Logger logger = LoggerFactory.getLogger(PythonLib.class);
|
|
@Value("${spring.redis.host}")
|
private String redisHost;
|
@Value("${spring.redis.port}")
|
private String redisPort;
|
@Value("${data.reliaSimLib.mainPy}")
|
private String reliaSimMain;
|
@Value("${data.reliaSimLib.resultHome}")
|
private String resultHome;
|
|
// private Long taskId = 123L;
|
// private Long taskId = 124L;
|
// private Long taskId = 100L; // =》 model1.xml1
|
private String taskType = "calcreq";
|
|
@Autowired
|
private RedisTemplate redisTemplate;
|
|
public Result callPython(SimulatAssess simulatAssess) {
|
Result result = null;
|
InputStream is = null;
|
BufferedReader br = null;
|
try {
|
setParamToRedis(simulatAssess);
|
|
Process process = null;
|
// String command = "python D:\\work\\python\\relia_calc.py";
|
String command = "python " + reliaSimMain;
|
command += " -ip " + redisHost + " -port " + redisPort;
|
command += " -taskType " + taskType + " -taskId " + simulatAssess.getId().toString();
|
logger.info("cmd命令为:" + command);
|
if(System.getProperty("os.name").toLowerCase().indexOf("windows") > -1){
|
process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", command});
|
}else if(System.getProperty("os.name").toLowerCase().indexOf("linux") > -1){
|
process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command});
|
}else{
|
throw new Exception("暂不支持该操作系统,进行启动python计算!");
|
}
|
is = process.getInputStream();
|
// 以命令行方式调用python时,返回的结果是utf-8编码
|
br = new BufferedReader(new InputStreamReader(is,"utf-8"));
|
String line = br.readLine();
|
logger.info("python返回结果:" + line);
|
// int exitCode = process.waitFor();
|
// if (exitCode == 0) {
|
logger.info("启动python计算成功");
|
if (line != null) {
|
PythonResult rtn = JSONObject.parseObject(line, PythonResult.class);
|
if ("0".equals(rtn.getCode())) {
|
result = Result.ok();
|
} else {
|
String errorMsg = rtn.getErrorMsg();
|
throw new RuntimeException("启动python计算失败: errorMsg=" + errorMsg);
|
}
|
}
|
// } else {
|
// logger.error("启动python计算失败: exitCode=" + exitCode);
|
// throw new RuntimeException("启动python计算失败: exitCode=" + exitCode);
|
// }
|
} catch (Exception e) {
|
logger.error("启动python计算时发生Exception:", e);
|
e.printStackTrace();
|
result = Result.error(e.getMessage());
|
} finally {
|
if (is != null) {
|
try {
|
is.close();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
if (br != null) {
|
try {
|
br.close();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
return result;
|
}
|
|
/*
|
public String getPythonCalcResult() {
|
String key = taskId.toString() + "calcprog";
|
logger.info("redis key:" + key);
|
String progress = (String)redisTemplate.opsForValue().get(key);
|
if (progress==null) progress = "0";
|
return progress;
|
}
|
*/
|
|
private void setParamToRedis(SimulatAssess simulatAssess) {
|
String key = simulatAssess.getId().toString() + taskType;
|
logger.info("redis key:" + key);
|
/*
|
String xmlfile = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
|
"<des name=\"General system\">\n" +
|
" <tasks>\n" +
|
" <task duration=\"200\" model=\"model1\"/>\n" +
|
" <task duration=\"100\" model=\"model2\"/>\n" +
|
" </tasks>\n" +
|
" <models>\n" +
|
" <model name =\"model1\">\n" +
|
" <logic name=\"总体\" type=\"series\"> \n" +
|
"\t\t\t\t<logic name=\"系统1\" type=\"series\"> \n" +
|
"\t\t\t\t\t<logic name=\"p1\" type=\"parallel\"> \n" +
|
"\t\t\t\t\t\t<node name=\"X1\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
" <repair_model name=\"rm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"X2\" type=\"node\" cycon=\"15\" cycdown=\"5\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t</logic>\n" +
|
" <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
|
"\t\t\t\t\t\t<node name=\"X3\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
" <repair_model name=\"rm2\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"X4\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t\t<node name=\"X5\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t</logic>\n" +
|
" <logic name=\"s1\" type=\"parallel\">\n" +
|
"\t\t\t\t\t\t<node name=\"X6\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"X7\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t\t<node name=\"X8\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t</logic>\n" +
|
"\t\t\t\t</logic>\n" +
|
"\t\t\t\t<logic name=\"系统2\" type=\"series\"> \n" +
|
"\t\t\t\t\t<node name =\"X14\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t<node name=\"X15\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t<node name=\"X16\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm3\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t</logic>\n" +
|
" </logic>\n" +
|
" </model>\n" +
|
" <model name =\"model2\">\n" +
|
" <logic name=\"总体\" type=\"series\"> \n" +
|
"\t\t\t\t<logic name=\"系统1\" type=\"series\">\n" +
|
"\t\t\t\t\t<logic name=\"p1\" type=\"parallel\"> \n" +
|
"\t\t\t\t\t\t<node name=\"X1\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"X2\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t</logic>\n" +
|
" <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
|
"\t\t\t\t\t\t<node name=\"X3\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"X4\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t\t<node name=\"X5\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t</logic>\n" +
|
" <logic name=\"s1\" type=\"parallel\">\n" +
|
"\t\t\t\t\t\t<node name=\"X6\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"X7\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t\t<node name=\"X8\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t</logic>\n" +
|
"\t\t\t\t</logic>\n" +
|
"\t\t\t\t<logic name=\"系统2\" type=\"series\"> \n" +
|
"\t\t\t\t\t<logic name=\"p2\" type=\"parallel\"> \n" +
|
"\t\t\t\t\t\t<node name=\"X14\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"X15\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t</logic>\n" +
|
"\t\t\t\t\t<node name=\"X17\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t</logic>\n" +
|
" </logic>\n" +
|
" </model>\n" +
|
" </models>\n" +
|
" <failure_models>\n" +
|
" <failure_model name=\"fm1\" type=\"exponential\">\n" +
|
" <failure-rate value=\"0.004\"/>\n" +
|
" </failure_model>\n" +
|
" <failure_model name=\"fm2\" type=\"fixed\">\n" +
|
" <unreliability value=\"0.04\"/>\n" +
|
" </failure_model>\n" +
|
" <failure_model name=\"fm3\" type=\"weibull\">\n" +
|
" <scale value=\"100\"/>\n" +
|
" <shape value=\"2\"/>\n" +
|
" </failure_model>\n" +
|
" </failure_models>\n" +
|
" <repair_models>\n" +
|
" <repair_model name=\"rm1\" type=\"exponential\">\n" +
|
" <repair-rate value=\"0.1\"/>\n" +
|
" </repair_model>\n" +
|
" <repair_model name=\"rm2\" type=\"weibull\">\n" +
|
" <scale value=\"13\"/>\n" +
|
" <shape value=\"2\"/>\n" +
|
" </repair_model>\n" +
|
" </repair_models>\n" +
|
"</des>";
|
*/
|
String xmlfile = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
|
"<des name=\"General system\">\n" +
|
" <tasks>\n" +
|
" <task duration=\"200\" model=\"model1\"/>\n" +
|
" <task duration=\"100\" model=\"model2\"/>\n" +
|
" </tasks>\n" +
|
" <models>\n" +
|
" <model name =\"model1\">\n" +
|
" <logic name=\"1813102074724945921\" type=\"series\"> \n" +
|
"\t\t\t\t<logic name=\"1721113377977629981\" type=\"series\"> \n" +
|
"\t\t\t\t\t<logic name=\"p1\" type=\"parallel\"> \n" +
|
"\t\t\t\t\t\t<node name=\"1721113796232438988\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
" <repair_model name=\"rm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"1721113971135848726\" type=\"node\" cycon=\"15\" cycdown=\"5\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t</logic>\n" +
|
" <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
|
"\t\t\t\t\t\t<node name=\"1721113929312687055\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
" <repair_model name=\"rm2\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"1721113465658619786\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t\t<node name=\"1721113182603098012\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t</logic>\n" +
|
"\t\t\t\t</logic>\n" +
|
"\t\t\t\t<logic name=\"1721113127170514122\" type=\"series\"> \n" +
|
"\t\t\t\t\t<node name =\"1721113197988754255\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t<node name=\"1721113169705470682\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t</logic>\n" +
|
" </logic>\n" +
|
" </model>\n" +
|
" <model name =\"model2\">\n" +
|
" <logic name=\"1813102074724945921\" type=\"series\"> \n" +
|
"\t\t\t\t<logic name=\"1721113377977629981\" type=\"series\"> \n" +
|
"\t\t\t\t\t<logic name=\"p1\" type=\"parallel\"> \n" +
|
"\t\t\t\t\t\t<node name=\"1721113796232438988\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
" <repair_model name=\"rm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"1721113971135848726\" type=\"node\" cycon=\"15\" cycdown=\"5\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t</logic>\n" +
|
" <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
|
"\t\t\t\t\t\t<node name=\"1721113929312687055\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
" <repair_model name=\"rm2\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t\t<node name=\"1721113465658619786\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t\t<node name=\"1721113182603098012\" type=\"node\">\n" +
|
"\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t\t</node> \n" +
|
"\t\t\t\t\t</logic>\n" +
|
"\t\t\t\t</logic>\n" +
|
"\t\t\t\t<logic name=\"1721113127170514122\" type=\"parallel\"> \n" +
|
"\t\t\t\t\t<node name =\"1721113197988754255\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t\t<node name=\"1721113169705470682\" type=\"node\">\n" +
|
"\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
|
"\t\t\t\t\t</node>\n" +
|
"\t\t\t\t</logic>\n" +
|
" </logic>\n" +
|
" </model>\n" +
|
" </models>\n" +
|
" <failure_models>\n" +
|
" <failure_model name=\"fm1\" type=\"exponential\">\n" +
|
" <failure-rate value=\"0.004\"/>\n" +
|
" </failure_model>\n" +
|
" <failure_model name=\"fm2\" type=\"fixed\">\n" +
|
" <unreliability value=\"0.04\"/>\n" +
|
" </failure_model>\n" +
|
" <failure_model name=\"fm3\" type=\"weibull\">\n" +
|
" <scale value=\"100\"/>\n" +
|
" <shape value=\"2\"/>\n" +
|
" </failure_model>\n" +
|
" </failure_models>\n" +
|
" <repair_models>\n" +
|
" <repair_model name=\"rm1\" type=\"exponential\">\n" +
|
" <repair-rate value=\"0.1\"/>\n" +
|
" </repair_model>\n" +
|
" <repair_model name=\"rm2\" type=\"weibull\">\n" +
|
" <scale value=\"13\"/>\n" +
|
" <shape value=\"2\"/>\n" +
|
" </repair_model>\n" +
|
" </repair_models>\n" +
|
"</des>";
|
JSONObject jsonObject = new JSONObject();
|
/*
|
Long simulate_times = 10000L;
|
Long timeslice = 10L;
|
jsonObject.put("xmlfile", xmlfile);
|
jsonObject.put("simulate_times", simulate_times);
|
jsonObject.put("seed", 1000);
|
jsonObject.put("timeslice", 1);
|
// jsonObject.put("timeslice", timeslice/60.0);
|
// jsonObject.put("timeslice", timeslice);
|
*/
|
jsonObject.put("xmlfile", xmlfile);
|
jsonObject.put("simulate_times", simulatAssess.getSimulatFrequency());
|
jsonObject.put("seed", 1000);
|
jsonObject.put("timeslice", simulatAssess.getSamplPeriod()/60.0);
|
jsonObject.put("result_home", resultHome);
|
redisTemplate.opsForValue().set(key, jsonObject.toJSONString());
|
}
|
}
|