1.引言
1.1目的
本文档主要对KNIME服务器可以通过网页或knime desktop远程调用knime服务器流程接口(流程信息、加载、执行、关闭等)、节点接口(节点信息、执行等)的预研与实现。
1.2概述
在文档《KNIME服务预研》中,设计了服务器的架构,定义了相关数据库表。本文档是在此基础上对具体功能的实现。我们主要做了如下工作:代码远程服务器流程接口,可以远程执行;可以通过接口获取流程信息;部分节点接口的预研与实现。
2 代码实现
2.1相关技术
后端开发我选择了当前比较流行的Spring Boot+MyBatis-Plus+Shiro+Swagger等框架,可以快速搭建后台,实现快速开发。
2.2 技术介绍
**Spring Boot简介:**Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
**MyBatis-Plus简介:**MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
**Shiro介绍:**shiro 是一个功能强大和易于使用的Java安全框架,为开发人员提供一个直观而全面的解决方案的认证,授权,加密,会话管理。
**Swagger简介:**Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。
2.3代码结构
代码主要目录结构如图2-2所示
图2-2 代码结构图
代码核心结构主要分为Controller、Entity、Dao、Service层 ,server端的接口都是在Controller层定义的,所以这里说一下Controller层的重要接口。
(1)ConmmandLine
这里面的最重要的是execute接口,当我们在前端或者远程请求执行流程时,会调用此接口。其原理是KNIME提供了使用命令控制符来执行一个流程,所以利用现有的特性,将KNIME桌面端部署到云端,就可以实现远程执行一个流程。在文档《搭建KNIME服务器》已经说过,我们尝试用KNIME的server构建一个服务端, 但是需要收费,所以后来经过研究发现,KNIME的server端和桌面端的核心代码一致,只是部署方式不同,所以利用现有的核心代码来搭建一个新的服务端。
(2)NodeRepositoryController
此类为实现节点相关操作的控制层,里面包含了节点的插入,节点信息查询等接口,提供了方便获取节点信息的相关接口。
(3)RepositoryController
此类为实现节点和流程操作的控制层,他是相当于一个既存储节点又存储流程的存储库,是对节点和流程信息的汇总,通过外键k_id和节点流程表联系,可以实现多表联查。其中最主要的接口是查询节点或者流程的相关信息,更新节点或者流程信息,存储节点和流程的最新状态。
(4)WorkflowRepositoryController
此类为实现流程相关操作的控制层,对应了数据库中workflow_repository表,专门用提供流程相关的接口。主要有,插入新的流程、查询流程的信息、更新流程的信息。
2.4 接口测试
引入依赖
图2-3
运行主程序,在浏览器输入:http://localhost:8083/swagger-ui.html,出现如图2-4
图2-4
图2-4就是实现功能的相关接口,可以在这里对接口进行一些测试,按照接口定义传入相应的参数,验证功能是否实现。
3.实现服务器相关接口
3.1流程信息
流程信息由文档《搭建KNIME服务器》中KNIME服务器的数据库设计,其中2.2.2的表2可知其包含的字段信息。这里通过接口来获取某一个流程的信息。
3.1.1代码实现
在RespositoryController层中,定义一个信息查询接口,来实现通过流程名字来查询该流程的所有信息。如下图3-1所示。这里是一个post请求,需要指定流程名。
图3-1 获取流程信息接口
3.1.2接口测试
利用Swagger来对接口进行测试,由提示可知需要传入流程名。如下图3-2所示,其中在Example Value中可以看到,它显示了成返回值的类型和数目。而且状态码为200表示成功。下面Parameter字段名名为name,且为String类型,规范了传参类型。
图3-2 respository-controller
输入流程名Data Generator,此流程名是存在于数据库的,如若数据库中没有此流程,测试会失败。输入之后,点击Try it out结果如图3-3所示。
图3-3接口返回图
由上图标红的地方可以看出查询成功,返回的值符合要求,实现了获取流程信息接口。
3.2流程执行
3.2.1代码实现
下图3-4为流程执行的接口
图3-4 流程执行接口
3.2.2接口测试
具体测试步骤在3.1.2有详细说明,这里不再赘述。执行数据库中已有流程,这里执行名为KNIME_project22.knwf的流程。
图3-5
输入流程名KNIME_project22.knwf并执行,如图3-6所示。
图3-6
此时会自动弹出cmd命令窗口,开始执行,如图3-7所示。
图3-7
控制台输出信息:
图3-8
3.3流程关闭
执行流程时,如果成功,它将会一直保持执行状态,我们可以主动关闭。流程执行时其实是新建了一个线程,这里对于流程关闭的思路是关闭该线程,就可以对该流程进行关闭。
3.3.1代码实现
接口代码如图3-9所示。
图3-9
3.3.2接口测试
在3.2中通过接口执行一个流程,会出现一个窗口来执行该流程。执行成功之后,调用cancel接口来关闭流程。如下图3-10所示。
图3-10
4.新建流程远程执行
服务器提供了接口,可供客户端远程调用
设计了一个流程,如下:
图4-1
此流程的功能是读取一个本地文件,然后将文件的内容写到一个新的.table文件并保存在对应自定义目录下。
4.1 导出
我们把该流程从KNIME工作台中导出,放到我们本地存储库中。此时server端也有一个存储库,暂时也在本地,因为server端暂时还是本地部署,但是其思路时一致的,如果部署到云端,云端也会有一个存储库。所以现在我本地有一个server端的存储库相当于云端的。
4.2 上传
首先我们想要在云端执行一个本地流程,那么server端在收到请求后,应该去server端的存储库查找是否有该流程,如果有则直接执行,如果没有则从本地hub上拉取。这一步在KNIME服务器的架构图也有展示。