docker版jxTMS使用指南:勾连python
本文讲解docker版jxTMS的功能扩展,整个系列的文章请查看:docker版jxTMS使用指南
在jxTMS设计思想的安全一文中,笔者讲述了考虑到安全问题,所以jxTMS限制了业务处理逻辑部分的能力。但企业的需求是多种多样的,必须考虑到全能力的支持。
所以jxTMS提供了全能力扩展来解决能力不够的问题。在jxTMS的体系框架中,这部分归入了扩展服务【参考jxTMS+进销存:概述中的阐述】。该功能属于jxTMS内置功能,所以docker版本也自然是支持的,下面我们就开始演示是如何扩展的。
首先正常启动jxTMS,然后在ssh客户端程序中,用dockerTMSRoot【注意:不是查看实时日志的dockerTMS配置】配置进行连接,dockerTMSRoot配置如果还没有配置,请参考docker版jxTMS使用指南:helloWorld!一文中的说明。
登录后,执行:
cd /home/tms/python
python3 py.py
出现【pyService.pythonDemo.demo1 register:ok/服务器正常响应】的消息,就说明该扩展已经正确的连接到了jxTMS中。
而此时,在tms容器的root控制终端,也会显示如下的日志信息【去除时间等信息】:
pyService.demo1 register,check result:ok
pyService.pythonDemo.demo1【pyService/demo1】添加到目录中
表明我们刚才启动的python扩展【名为:pyService.pythonDemo.demo1】已经正确的注册到jxTMS中了,可以使用该扩展了。
然后,打开capa.py文件,修改sayHello函数:
@myModule.event('cmd', 'sayHello')
def sayHello(self, db, ctx):
#发送给python扩展的json参数
ps = jxJson.getObjectNode()
ps.set('n1','xxx')
ps.set('n2','yyy')
#所以ps是:{'n1':'xxx','n2':'yyy'}
#向python扩展发送testCmd命令,并送入参数ps
rs = catalogService.call('pyService.pythonDemo.demo1','testCmd',ps)
#在日志中打印接收到的响应信息
jx.log('catalogService call rs:{}',rs)
然后保存并上传capa.py,并热机刷新。
然后点击快捷栏【演示->helloWorld】,然后点击【点我】按钮。
这时可以看到实时日志显示:
catalogService call rs:{"cmd":"test","r1":"xxx","r2":"yyy","ty":"response"}
而dockerTMSRoot终端显示:
{"level":"info","time":"2023-03-18T17:29:01.010+0800","linenum":"utils/jxLog.go:82","msg":"pyService.pythonDemo.demo1 从【demoHost1】接收到控制命令:testCmd"}
{'n1': 'xxx', 'n2': 'yyy'}
这些信息表明python扩展正确的接收到了我们提供的参数并予以了正确的响应。
OK!我们现在来看看python扩展是什么样的。显示py.py文件内容:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from jx.jxGo import jxGo
from jx.jxGoBaseService import jxGoBaseService
class Py(jxGoBaseService):
def __init__(self, ty, hostname, name):
super(Py,self).__init__(ty, hostname, name)
def testCmd(self,params):
print(params)
return {'ty':'response','cmd':'test','r1':params['n1'],'r2':params['n2']}
#读取系统配置的主机名
#系统配置位于conf目录下的system.json文件中
hn = jxGo.getSysConfig('hostName')
#以类型:pyService,名字:demo1和主机名,创建一个Py对象
py = Py('pyService',hn,'demo1')
#启动py开始执行,直到程序结束【按ctrl+c结束】
py.start()
其声明了一个Py的类,该类继承自jxGoBaseService。该类中定义了一个testCmd的函数,该函数先是打印送入的参数,然后做了一个回应,就是简单的读取参数的值再回送。
该扩展的名字格式是:类型.主机名.名称,就是我们前面在py.py启动后成功注册时所看到的名称:pyService.pythonDemo.demo1。
在python扩展成功注册后,我们就可以调用catalogService的call函数向其发送命令。call函数的签名为:
catalogService.call(fullname,cmd,params)
通过目录服务向一个服务发送命令
参数:
fullname:服务全名,格式为:类型.主机名.名称
cmd:要求服务执行的命令
params:json型参数
返回值:
json服务执行结果
对于python来说,只要在继承自jxGoBaseService的子类中定义一个函数,就可以用catalogService.call来访问该函数了。
如果客户是ubuntu系统,并安装了python3.8版本的python,那么通过如下的步骤就可以实现自己的python扩展:
1、安装如下的python包:
-
pytz
-
psutil
-
numpy
2、把/home/tms/python目录拷贝到自己的机器上,然后根据自己的需要修改py.py
3、在conf目录下的system.json文件中增加rabbitMQ的配置:
-
mqServerIP:rabbitMQ服务所在ip地址,这里必须是tms容器所在服务器的ip地址
-
mqServerPort:rabbitMQ服务使用的端口,可忽略,如忽略则为默认的5672端口
-
mqUsername:rabbitMQ服务分配的用户名,如未使用用户则忽略
-
mqPassword:rabbitMQ服务分配的密码,如未使用用户则忽略
4、关闭并删除tms容器,重新创建tms容器时,增加一个5672端口的映射
大家通过上述的演示,应该明白python扩展,其实就是一个catalogService的客户端程序。catalogService是jxTMS核心的目录服务,主要是用来对所有的web服务器、应用服务器、所有启用的组织进行统一的管理与调度,这里还利用其实现了python扩展。
catalogService支持保活、热备份,同时还具有下达代码由目标机器执行的能力。是jxTMS的核心管控部件,即没有catalogService服务,jxTMS一样可以正常运行,但就没有了对所有的web服务器、应用服务器、所有启用的组织和服务扩展进行集中的管理、控制与调度能力。
注:python扩展所引用的catalogService客户端组件,是笔者用go所写并编译为so库,所以只能用于linux系统。由于笔者使用的都是ubuntu系统,其它类型的linux笔者并未进行过测试。所以如果想使用python扩展,最好先自己用py.py做个测试
笔者曾使用jxTMS的扩展能力开发过智能转运箱,验证了python能力扩展的全能力支持。
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:
jxTMS的HelloWorld