大家好,给大家分享一下java和python能联合开发吗,很多人还不知道这一点。下面详细解释一下。现在让我们来看看!
java与python之间的混合开发
1. 项目需求
使用java进行进行数据库的访问,并对查询出的数据进行的数据清理,使用python进行无监督分类
应用场景:
. 整个项目是BS架构,基于SpringBoot2.0
. 业务端主要是通过Java来实现后台与数据库的连接与交互
. 算法端主要通过python实现
实现的目标:
- Java通过多线程任务调度定时完成任务调度,完成对数据库中的某一数据进行聚类并生成对应的聚类模型,聚类和模型生成由Python实现;
- 通过前端调用Resful接口来调取后端的接口,再通过java来与python交互,实现模型的调用来完成新数据的推理;
- 整个过程python不涉及查数据库,Java查数据库之后实现数据的清洗和预处理,按照约定的格式传递给python来进行数据的算法实现
2.方案
-
可以通过udp或者tcp协议来传递数据
缺点:a. 不能异步通信;b.安全性不高;c.调试麻烦;d.数据容易丢失
-
通过网络接口(Restful)的方式,调用python服务(通过http的POST请求中的Body将数据传入,没有测试过数据量)
-
通过消息中间键,来作为数据传递和消息传递的媒介,通过队列的方式来传递数据,实现异步通信,并且通过中间键作为中介有管理系统,安全性高,有对应的管理界面调试比较简单,能够查看推送的数据是什么;使用队列来作为日志信息的输入和输出;
-
最终确定的方案:选用方案二
使用消息中间键的好处:-
数据不容易丢
-
能够实现异步通信
异步方式指消息发送方在发送消息时不必知道接收方的状态,更无需等待接收方的回复,而接收方在收到消息时也不必知道发送方的目前状态,更无需进行同步的消息处理,它们之间的连接完全是松耦合的,通信是非阻塞的,这种异步通信方式是由消息中间件中的消息队列及其服务机制保障的
-
能够消峰(通过队列的形式,防止一直访问服务)
用消息队列来缓冲瞬时流量,把同步的直接调用转换成异步的间接推送,中间通过一个队列在一端承接瞬时的流量洪峰,在另一端平滑地将消息推送出去。
-
3.技术选型
Java端使用springboot2.0框架来搭建服务,使用MyBattisPlus操作数据库
消息中间键:本文针对的数据量不算特别大,也不需要很高的吞吐量,所以选用稳定且功能完备,spring集成的ActiveMQ
python端使用stomp消息传输框架来对ActiveMq的消息队列进行监督
4. 代码实现
SpringBoot2.0集成ActiveMq
添加pom文件
<!--ActiveMq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
<!--消息队列连接池-->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.15.0</version>
</dependency>
构建一个生产者服务
java和ActiveMq相关的配置文件
- 通过yml文件配置
server:
port: 777 #生产者,微服务端口号
#ActiveMq
spring:
activemq:
broker-url: tcp://192.168.1.151:61616 #mq的位置(61616是后台的位置)
user: admin
password: admin
jms:
pub-sub-domain: false #false为Queue true为topic,默认为false,目前正在探索怎么队列和topic一起使用
processQueueName: activemq-queue-data-process
reciveQueueName: activemq-queue-result
trainQueueName: activemq-queue-data-train
reciveFigQueueName: activemq-queue-result_fig
reciveLogTopic: /topic/Log
- config配置,注意**@Bean**注解的是对象的初始化函数,后面使用Autoware注入的时候,会自动的调用这个初始化函数,生成对应的对象
package com.atguigu.activemq.bootMqProduce.bootMqProduce.config;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.E