LUA与STOMP协议
作者:糖果
STOMP协议是一种简单的消息文本协议。协义本身简单明了,用消息头定义和消息体数据传输。
RabbitMQ做为一种队列中间件,提供了STOMP协议的支持,我们可以通过STOMP协议向队列发送消息。下面的例子中,我们将使用LUA程序向RabbitMQ发送消息, 通过Python程序读取消息。
send.lua文件
local client = require "stomp"
local mq, err = client:new()
local ok, err = mq:connect("127.0.0.1", 61613)
local msg = "say hi!"
local headers = {}
headers["destination"] = "/queue/test"
headers["app-id"] = "APP"
local ok, err = mq:send(info_json, headers)
对上面的代码说明一下:
连接时候RabbitMQ的IP是本机的127.0.0.1, STOMP协议的服务的端口是默认的61613。
在headers的头定义部分,指明了我们发送信息的目的地“/queue/test“名字为Test的队列。
其实可以深入到STOMP的LUA的实现内部,仔细研究一下是如何实现,如何直接通过sock,发送数据帧到服务器,可以作为独立的章节。
与LUA不同,Python对STOMP协议支持的比较好,不需要甄别第三库,然后再选择使用。用pythonstomp就好。
receive.py文件
import stomp
import time
import sys
import random
import json
class MyListener(stomp.ConnectionListener):
def on_error(self, headers, message):
print('received an error %s' % message)
def on_message(self, headers, message):
for k,v in headers.iteritems():
print('header: key %s , value %s' %(k,v))
print('received message\n %s'% message)
conn=stomp.Connection([('127.0.0.1',61613)])
conn.set_listener('somename',MyListener())
conn.start()
conn.connect(wait=True)
message='say hi!'
dest = '/queue/test'
headers={'seltype':'mandi-age-to-man','type':'textMessage','MessageNumber':random.randint(0,65535)}
metadata = [
]
info_json = json.dumps(metadata)
conn.send(body=info_json, destination='/queue/test')
conn.disconnect()
接受程序和发送程序的主要流程区别是:要在接受端注册监听回调程序。
上面的
conn.set_listener('somename',MyListener())
conn.start()
这两行代码就是注册监听类,在队列上有消息的时候,就会调用监听回调。
on_message。发生错误的时候调用。on_error函数。
具体的实现不完全列出来,针对一般的STOMP连接过程,列出”连接“和
发送的”消息包”的数据结构,结构采用的是LUA语法,table类型定义的。
共计二帧的数据:
connect_frame = {
"CONNECT\n",
"accept-version:1.2\n",
"login:guest\n",
"passcode:guest\n",
"host:/\n",
"\n\n",
"\0"
}
send_frame = {
"SEND\n",
"destination:/queue/test\n",
"app-id:APP\n",
"\n",
"say hi!\n",
"\0"
}
包体的第一个字段“CONNECT,SEND”都是协议的命令,剩下的是说明字段。
文字不能把所有的问题和协议都描述清楚,可参考以下网站:
http://stomp.github.io/stomp-specification-1.1.html
PS:转载到其它平台请注明作者姓名及原文链接,请勿用于商业用途。