美文网首页
Lua App中通过Sqlite实现消息队列(异步通信)

Lua App中通过Sqlite实现消息队列(异步通信)

作者: LastKnight | 来源:发表于2017-03-16 20:56 被阅读0次

    实践动机和目标

    目前具有社交功能的App中大量使用本地Sql来存储用户记录,同时为了优化用户体验,这些App都愿意提供用户在无网(或弱网)环境下操作的需求。因此,在App中有必要有异步通信机制来处理(响应)用户的请求。

    实现原理

    1.通过在Sqlite中设立事件表(EventTable),来记录用户操作信息。

    2.借由Lua提供的协程来处理用户请求,并向服务器发送请求。

    3.完成与服务器的一次响应事件后,删除这一条操作事件。

    建立事务表

    在Sqlite中建立事务表,建议在表中设立一个时间戳类型的字段(EventDate)。采用时间戳类型的字段主要有两个目的:

    1.作为事件的唯一标识符

    2.时间戳类型本身可以作为字段进行排序

    由此联想:Sqlite本身对每一行数据都会设置一个id,能否利用这个字段进行排序?

    获取队列

    队列的必要特性就是先进先出,那么就要在sql语句中实现。代码如下:

    select * from EventTable order by EventDate ASC limit 1

    order by EventDate ASC 按照EventDate对EventTable事件表进行正序排序

    limit 1 取顶部第一条数据

    设置Lua线程

    Lua语言本身提协同程序处理,创建协程代码:

    function  syncService(...)

           while true do

                  -- [[ 处理内容 ]] --

                  sleep(1)

           end

    end

    local syncData = coroutine.create(syncService)

    functiononReady(...)

             coroutine.resume(syncData)

    end

    完善处理内容

    在处理内容中可以完成API请求,在这个步骤中可以做以下配置:

    设定一个全局变量 local sync = true

    方法体中依次完成队列获取、调取API、删除队列(释放):

    local sync = true--全局变量

    if sync then

          local data =  dbHelper.execTable("select*fromEventTableorderbyEventDateASClimit1", "select”)

          if data and #data >0 then 

                 if data[1] and data[1].EventDate then

                        sync =false

                        local response = post( ) --调取API,这里做了简略

                        if response ==200 then

                               dbHelper.execTable("delete from EventTable where EventDate = '"..data[1].EventDate.."'","delete") --释放队列            

                               sync =true

                        else 

                               sync =true

                        end

                end

          end

    end

    以上就是利用Lua来实现消息队列的基本思想

    思考:调取线程中使用while死循环是否可取,有无更好的替代方案?

    相关文章

      网友评论

          本文标题: Lua App中通过Sqlite实现消息队列(异步通信)

          本文链接:https://www.haomeiwen.com/subject/nofsnttx.html