codecamp

MQ

MQ库

MQ库是CF框架针对httpd的Websocket路由实现的一种订阅发布库.

众所周知: 客户端在使用Websocket协议与服务端进行通信的情况下, 服务端需要主动推送必须处于一种'定时器/订阅'的状态才能主动触发推送消息到客户端.

MQ借用Redis/MQTT的subscribe与publish实现此种功能.

MQ:new(opt)

opt.hostMQ Broker的主机名或IP地址.

opt.portMQ Broker的主机端口号.

opt.typeMQ Broker的类型(redis/mqtt).

opt.authMQ Broker(redis类型专有)用于redis broken验证.

opt.username/passwordMQ Broker(mqtt类型专有)用于username/password验证.

此方法返回一个MQ实例.

MQ:on(pattern, function handle(msg) end)

patternstring类型, 用来指定订阅的位置;

handlefunction类型, 订阅消息到回调处理函数;

msg table类型, 消息根据不同类型broker各有差异;

这里根据script/ws.lua文件精简之后给出一段代码示例:

    local MQ = require "MQ"
    local class = require "class"


    local websocket = class("websocket")


    function websocket:ctor(opt)
        self.ws = opt.ws             -- websocket对象
        self.mq = MQ:new({host = 'localhost', port = 6379, type = 'redis'})
    end


    function websocket:on_open()
        self.mq:on('/test/*', function (msg) -- 消息队列
            if not msg then
                self.ws:send('{"code":500,"message":"无法连接到mq broker(redis)"}')
                return self.ws:close()
            end
            self.ws:send('{"code":200}')
        end)
    end

此方法返回true表示订阅成功, 但情况下可忽略. msg为nil的情况下说明mq broker已经断开连接.

MQ:emit(pattern, data)

patternstring类型, 用来指定data所需要发布到的订阅位置;

datastring类型, 需要发布的消息;

  --- 代码示例
  local ok = MQ:emit('/test/admin', '{"code":200}')

此方法返回true表示发布成功, 但是不要过于依赖返回值. 因为MQ内置断线重连机制, 因为网络异常等原因可能会很久才会返回.

MQ:close()

此方法用来正确关闭MQ的发布与订阅.

如果使用者将MQ用在websocket, 需要关闭时应该在websocket的on_close方法关闭(推荐)

如果用在其它地方, 请仔细调试过后再试用. 作者不保证在websocket以外的地方能正常(正确)工作.

此方法没有返回值.

最后

有小伙伴对websocket长连接有兴趣的可以下载cf发布在docker hub上的容器体验一下, 使用chrome的websocket客户端插件(smart websocket client)就可以对接查看效果.

MQ库是因为为对接第三方协议(gRPC等)平台而自己创建的一种消息通讯方式. 很多使用者因为自行定制化协议, 所以CF作者用MQ示例来作为一种最直观的对接方式.

class
Crypt
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

API 使用手册

HTTP API

Mail API

DB API

DB

Cache API

class API

MQ API

MQ

Crypt API

cf API

cf

System API

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }