作者:糖果

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:转载到其它平台请注明作者姓名及原文链接,请勿用于商业用途。