【发布时间】:2019-09-11 20:59:41
【问题描述】:
我正在开发一个简单的气象站 - 我想使用 raspberry pi 3b+ 作为主机、dht22 传感器并用 Java(使用 spring boot,然后将其部署到 tomcat 8)和 Python 编写一个 Web 应用程序来检索传感器的数据. 到目前为止我做了什么:
用于检索和显示数据的 Python 应用程序。按预期工作,它只打印类似“22.5;37.4”的内容:
import Adafruit_DHT
DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
if humidity is not None and temperature is not None:
print("{0:0.1f};{1:0.1f}".format(temperature, humidity))
else:
print("FAIL")
然后我编写了一个 java 应用程序,将它放入 .jar 并检查我是否能够获取传感器的数据。不是火箭科学,当我在树莓派上使用 java -jar InputTest.jar 时也能按预期工作:
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("python", "/home/pi/Desktop/input/dht_once.py");
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println("measured: " + line);
}
process.waitFor();
} catch (IOException ) {
System.out.println(" exception " + e.getLocalizedMessage());
}
}
然后我创建了一个spring boot应用程序,把我的java代码放进去(逻辑同上),打包成一个war,部署到tomcat 8并运行它。结果没有打印任何东西(当然我已经将代码更改为将输出记录到日志文件,它工作正常,我可以看到里面的其他日志)。日志中没有问题,看起来阅读器从不返回一行。
我相信应用程序不会等待进程产生输出,但我不知道为什么。重要的是:产生传感器的输出最多需要几秒钟。我还更改了 python 脚本只是为了测试目的立即返回值:
print("22.4;33.0")
它会导致 java web 应用程序成功读取。但是当它必须等待几秒钟的输出时,它会杀死进程(process.isAlive() 在 while 循环之后是假的)。 我还尝试在当前线程上使用 sleep() 来强制它等待 python 进程但没有成功。
你们知道这种行为的原因是什么吗?还有什么我应该检查的吗?
TLDR;
创建 python 进程的 Java 应用程序工作正常,直到我将它作为 Web 应用程序运行 - 然后看起来它不等待进程的输出
【问题讨论】:
标签: java python spring spring-boot tomcat