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 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; private Long taskId = 123L; private String taskFlag = "relia"; @Autowired private RedisTemplate redisTemplate; public Result callPython() { Result result = null; InputStream is = null; BufferedReader br = null; try { Process process = null; String command = "python D:\\work\\python\\relia_calc.py"; command += " " + redisHost + " " + redisPort; command += " " + taskFlag + " " + taskId.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时,返回的结果是GBK编码的,而非utf-8 br = new BufferedReader(new InputStreamReader(is,"gb2312")); 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 = taskFlag + taskId.toString(); logger.info("redis key:" + key); String progress = (String)redisTemplate.opsForValue().get(key); if (progress==null) progress = "0"; return progress; } }