首页 > 其他分享 >【网关开发】6.lua绑定委托(delegate)实现多播调用

【网关开发】6.lua绑定委托(delegate)实现多播调用

时间:2023-01-28 16:02:04浏览次数:43  
标签:多播 网关 invoke self list lua delegate ._ local

目录

背景

在程序开发过程中有时会遇到事件流的问题,某一个结果会触发A、B、C等一系列动作。需要将各种事件注册给委托类(Delegate)。Delegate类会依次触发注册的函数,完成相应的动作。

实现原理

lua中可以使用元表和队列的形式进行实现

实现细节

delegate.lua

local _M = { }

local _MT = { __index = _M }

local setmetatable = setmetatable
local table_remove = table.remove

-- _invoke_list 注册队列
-- _count 注册计数
function _M.new()
    return setmetatable({ _invoke_list = { }, _count = 0 }, _MT)
end
-- __call 函数实现
function _MT:__call(...)
    local _invoke_list = self._invoke_list
    for i = 1, self._count do
        _invoke_list[i](...)
    end
end
-- 增加
local function add_delegate(self, cb, ...)
    if not cb then
        return self
    end
    local _invoke_list = self._invoke_list
    local idx = self._count + 1
    self._invoke_list[idx] = cb
    self._count = idx
    return add_delegate(self, ...)  -- 递归添加
end

-- 会检查是否已经注册
local function add_delegate2(self, cb, ...)
    if not cb then
        return self
    end
    local _invoke_list = self._invoke_list
    for i = 1, self._count do
        if _invoke_list[i] == cb then
            -- already exists, skip
            return add_delegate2(self, ...)
        end
    end
    local _invoke_list = self._invoke_list
    local idx = self._count + 1
    self._invoke_list[idx] = cb
    self._count = idx
    return add_delegate2(self, ...)
end

local function remove_delegate(self, cb, ...)
    if not cb then
        return self
    end
    local _invoke_list = self._invoke_list
    for i = 1, self._count do
        if _invoke_list[i] == cb then
            table_remove(_invoke_list, i)
            self._count = self._count - 1
            break
        end
    end
    return remove_delegate(self, ...)
end

local function is_empty(self)
    return self._count == 0
end

_M.__add = add_delegate
_M.__sub = remove_delegate
_M.invoke = _MT.__call
_M.add_delegate = add_delegate
_M.add_delegate2 = add_delegate2
_M.remove_delegate = remove_delegate
_M.is_empty = is_empty

return _M

应用

-- 测试函数
local function delegate_test1(data)
    ngx.log(ngx.INFO,"delegate_test1 "..data)
end
local function delegate_test2(data)
    ngx.log(ngx.INFO,"delegate_test2 ".. data)
end

local function init() 
    watcher  = delegate.new()
    watcher:add_delegate2(delegate_test1)
    watcher:add_delegate2(delegate_test2)
    watcher("test")
end

测试

思考与总结

整个实现就是一个简单列表和对列表的操作,很好理解。结合场景实现一些广播功会更加方便。

标签:多播,网关,invoke,self,list,lua,delegate,._,local
From: https://www.cnblogs.com/zhaosc-haha/p/17069973.html

相关文章

  • 0001-手机编程之Lua环境配置
    一、Lua应用场景游戏开发独立应用脚本Web应用脚本扩展和数据库插件如:MySQLProxy和MySQLWorkBench安全系统,如入侵检测系统教程采用AideLuaPro或AndLua+开发......
  • wireshark 中使用lua解析自定义协议
    简述利用wireshark+lua实现自定义协议实时解析,保存分析结果1.找到版本和init.lua的位置:C:\ProgramFiles\Wireshark    2.修改init.lua(该版本是默认打开的,......
  • SpringCloud网关
    SpringCloud网关目前Cloud主流组件SpringCloudGateway目录一、Gateway简介1、官网2、是什么3、能干嘛4、有Zuul了怎么又出来了gateway5、Gateway特征6、Spring......
  • STC51 STC15开发工控网关-工控主机-02-开关量采集原理与设计
    开关量采集电路适用于对开关量信号进行采集,如循环泵的状态信号,进出仓阀门的开关状态灯开关量。污染源在线检测仪可采集16路开关信号,输入24VDC;设定当输入范围为18~24VDC时,认......
  • Nginx与LUA(7)
    您好,我是湘王,这是我的51CTO博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!软件开发中,除了进程和线程,还有协程的概......
  • Nginx与LUA(7)
    您好,我是湘王,这是我的博客园。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!   软件开发中,除了进程和线程,还有......
  • STC51 STC15开发工控网关-工控主机-附录A-软件设计
    1)软件架构设计2)数据结构设计数据缓存,包含接收和发送缓存,接收到最后一个字符的控制器运行时间,用来做字符间超时来判断一个报文是否接收完成typedefstruct_tagRecDataP......
  • 配置nginx的上游服务器,实现将发送给nginx 的请求转发给网关
    首先需要在nginx的nginx.conf的http模块配置上游服务器  再将nginx中的conf.d中的任意一个配置文件中配置server模块  如果网关是通过host的方式进行匹配,需要......
  • Nginx与LUA(6)
    您好,我是湘王,这是我的博客园。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!  如前所述,OpenResty是一个基于Ngin......
  • Nginx与LUA(6)
    您好,我是湘王,这是我的51CTO博客。值此新春佳节,我给您拜年啦~祝您在新的一年中所求皆所愿,所行皆坦途,展宏“兔”,有钱“兔”,多喜乐,常安宁!如前所述,OpenResty是一个基于Nginx与Lua......