异构模块之间如何数据传输?举例java和python两种不同语言编写的模块之间数据交互的几种方式(入门消息队列RabbitMQ)
问题描述
项目过程中可能会遇到,java从数据库取了很多数据,但java本身不方便处理,所以传递给python去处理,如何传?这里我结合很多已存在的方法,然后再谈谈怎么用rabbitmq来操作。
这里会举简单的例子示范,当然前提你需要了解基本的java,python代码编写,大致了解下队列、rabbitmq是啥,还有相关的文件操作、json等等。
方法
方法一:java直接执行python脚本.py文件,把数据放到参数里传递
举例说明:
java代码,
@Test
public void test() {
String pythonPath="/Library/Frameworks/Python.framework/Versions/3.6/bin/python3 ";
String filePath="/Users/guang/Documents/Python_Project/Test/test/receiver.py ";
//首先定义个list,赋值。
List<Integer> list1 = new ArrayList<Integer>();
int i = 1;
while(i<=10000) {
list1.add(i);
i++;
}
//调用python脚本并传递list
try {
Process process = Runtime.getRuntime().exec(
pythonPath + filePath + list1);
BufferedReader in=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line=in.readLine())!=null){
System.out.println(line);
}
in.close();
int re=process.waitFor();
System.out.println(re==1?"----状态码1----运行失败":"----状态码0----运行成功");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
python代码,
if __name__ == '__main__':
print("------------- start -------------")
# print("len(sys.argv[1:])==", len(sys.argv[1:]))
print("sys.argv[1:]==", sys.argv[1:])
运行结果:
这样的方式有两个问题:
1、参数传输过程中形式会发生变化,比如上面我实际想传一个list过去,但通过sys.argv[1:]可以看到,拿到的数据是一个被加工过的字符串形式,这样你又要花费大量精力去切割或者其他操作来把它在python中变成一个列表;
2、你不妨试着把数据量调大10倍,从10000 -> 100000,发现会报下面的错误,因为传不了那么大的。
方法二:通过第三方文件作为中间站
(因为遇到项目的特殊性,这里举的例子是把大量数据存储到了excel中),即增加了写入和读取的过程。
数据准备:
为了方便测试,这里模拟java从数据库取出的每条数据是这么个简单的形式:
某地区|某年指标1|某年指标2|某年指标3| …
模拟生成数据代码:
public class testObj {
private String place;
private List<Integer> datalist;
public S