jinlin
2024-06-24 3ca8ce266bf5b06556d80c78b31405e7a54aa4e5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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;
    }
}