python网关
fjagep的Python项目详细描述
简介
这个python包提供了一个与fj_ge代理交互的Gateway
类。fj_ge代理驻留在一个或多个提供代理管理、目录和消息传递服务的容器中。不同的容器可以在同一个节点上运行,也可以在网络中的不同节点上运行。pythonGateway
类允许外部python脚本使用python实现的接口与fj_ge代理交互。pythonapi使用包fjagepy
。
第一步是使用:
安装fjagepy
包
pip install fjagepy
从fjagepy
包中导入所有必需的符号:
from fjagepy import Gateway, AgentID, Message, MessageClass, GenericMessage, Performative
或者只是:
from fjagepy import *
导入消息类
由于java/groovy消息类在python中不直接可用,因此我们使用MessageClass
实用程序动态创建指定的消息类。例如:
ShellExecReq = MessageClass('org.arl.fjage.shell.ShellExecReq')
ShellExecReq
类现在可以用于实例化新对象,如:
msg = ShellExecReq()
作为字符串的完全限定类名必须作为此方法的参数提供。fj_ge已经支持的完全限定类名是文档化的here。
打开连接
如果fjage服务器正在运行,我们可以使用Gateway
类创建连接:
gw = Gateway(hostname, port)
其中hostname
和port
是运行fj_ge服务器的设备的IP地址和端口号。创建gw
对象,该对象可用于调用Gateway
类的方法。
发送和接收消息
我们在前面已经看到,代理之间使用消息进行交互。python网关同样可以向运行在不同机器上的容器上的代理发送和接收消息。请求和响应消息的示例如下所示:
请求消息:
msg = Message() msg.recipient = 'abc' gw.send(msg)
其中'abc'
是您尝试将消息发送到的代理的名称。
另一种发送消息的方法如下:
msg = Message(recipient = 'abc') rsp = gw.request(msg, timeout)
在上面的代码片段中,使用请求方法发送消息并接收响应。可以接收的不同响应被记录为here。
msg
是Message
类的实例,在ablove示例中,指定的收件人被设置为名为“abc”的代理。构造的消息msg
可以使用gw.send(msg)
发送到主容器上运行的代理。
从使用网关类打开的远程连接执行shell命令的简单示例如下所示:
gw = Gateway(hostname, port) ShellExecReq = MessageClass('org.arl.fjage.shell.ShellExecReq') shell = gw.agentForService('org.arl.fjage.shell.Services.SHELL') req = ShellExecReq(recipient=shell, cmd = 'ps') rsp = gw.request(req, 1000) print(rsp) gw.close()
在上面的代码中,我们首先打开到fj_ge服务器的连接。接下来,我们导入稍后需要的ShellExecReq
消息。我们希望将此消息发送到支持SHELL
服务的代理(接受ShellExecReq
消息)。Gateway
类的agentForService
方法允许我们查找该代理。接下来,我们构造ShellExecReq
消息来请求执行shell命令(在本例中为ps
)。然后,request
方法发送消息并等待响应,然后打印并关闭连接。
一般消息
由于前面已经解释了GenericMessage
的用例,我们将使用python网关api来说明它的使用:
gw = Gateway(hostname, port) shell = gw.agentForService('org.arl.fjage.shell.Services.SHELL') gmsg = GenericMessage(recipient=shell, text='hello', data=np.random.randint(0,9,(100))) gw.send(gmsg)
在服务器端运行的shell代理将接收通过网关发送的一般消息:
rgmsg = receive(GenericMessage, 1000) println rgmsg.text println rgmsg.data
发布并订阅
我们知道有时我们可能希望在不明确知道收件人是谁的情况下发布邮件。订阅我们发布的主题的所有代理都将收到已发布的消息。例如:
gw.topic('abc')
返回表示命名主题的对象。用户可以使用:
gw.subscribe(gw.topic('abc'))
但如果我们有兴趣接收从某个特定代理发送的所有消息,而该代理的AgentID
我们知道(例如shell
),然后:
shell = gw.agentForService('org.arl.fjage.shell.Services.SHELL') gw.subscribe(shell)
将允许shell
代理接收已发布的消息。
关闭连接:
为了关闭到fj_ge服务器的连接,我们可以调用由Gateway
类提供的close
方法:
gw.close()