| | |
| | | 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; |
| | |
| | | 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 String taskFlag = "relia"; |
| | | // 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() { |
| | | 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"; |
| | | command += " " + redisHost + " " + redisPort; |
| | | command += " " + taskFlag + " " + taskId.toString(); |
| | | // 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}); |
| | |
| | | throw new Exception("暂不支持该操作系统,进行启动python计算!"); |
| | | } |
| | | is = process.getInputStream(); |
| | | // 以命令行方式调用python时,返回的结果是GBK编码的,而非utf-8 |
| | | br = new BufferedReader(new InputStreamReader(is,"gb2312")); |
| | | // 以命令行方式调用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) { |
| | | // int exitCode = process.waitFor(); |
| | | // if (exitCode == 0) { |
| | | logger.info("启动python计算成功"); |
| | | if (line != null) { |
| | | PythonResult rtn = JSONObject.parseObject(line, PythonResult.class); |
| | |
| | | throw new RuntimeException("启动python计算失败: errorMsg=" + errorMsg); |
| | | } |
| | | } |
| | | } else { |
| | | logger.error("启动python计算失败: exitCode=" + exitCode); |
| | | throw new RuntimeException("启动python计算失败: exitCode=" + exitCode); |
| | | } |
| | | // } 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) { |
| | | if (is != null) { |
| | | try { |
| | | is.close(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | if (br == null) { |
| | | if (br != null) { |
| | | try { |
| | | br.close(); |
| | | } catch (Exception e) { |
| | |
| | | return result; |
| | | } |
| | | |
| | | /* |
| | | public String getPythonCalcResult() { |
| | | String key = taskFlag + taskId.toString(); |
| | | 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>"; |
| | | 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()); |
| | | } |
| | | } |