Lua App中通过Sqlite实现消息队列(异步通信)
来源:互联网 发布:傻瓜式淘宝客app 编辑:程序博客网 时间:2024/05/16 13:49
实践动机和目标
目前具有社交功能的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) endendlocal syncData = coroutine.create(syncService)function onReady( ... ) coroutine.resume(syncData)end
完善处理内容
在处理内容中可以完成API请求,在这个步骤中可以做以下配置:
设定一个全局变量 local sync = true
方法体中依次完成队列获取、调取API、删除队列(释放):
local sync = true --全局变量if sync then local data = dbHelper.execTable("select * from EventTable order by EventDate ASC limit 1", "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来实现消息队列的基本思想,运用到的以下知识点:Lua 协程、Sqlite数据库操作
思考:调取线程中使用while死循环是否可取,有无更好的替代方案?
0 0
- Lua App中通过Sqlite实现消息队列(异步通信)
- 消息在多线程中实现异步通信
- 异步实现消息队列
- HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理
- HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理
- 消息队列实现通信
- 通过父子进程实现消息队列的互相通信
- linux c之通过消息队列实现进程通信
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理 (1)
- android HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理(2)
- 如何通过异步方法读取消息队列(BeginReceive())?
- POSIX消息队列的异步通信机制
- 队列实现异步--通过redis
- linux 消息队列实现通信
- C 消息队列实现通信
- VxWorks中基于消息队列实现C/S通信
- 系出名门Android(10) - HTTP 通信, XML 解析, 通过 Hander 实现异步消息处理
- UVALive 5717 & HDU 4085 Peach Blossom Spring(DP+斯坦纳树)
- Ubuntu14.04下安装OpenCV3.0经验
- Define and use ripple
- 北邮OJ-88. 最值问题-13网研上机A
- 当执行mvn package的时候,maven是怎么打包的
- Lua App中通过Sqlite实现消息队列(异步通信)
- AIR平台应用
- 条件编译
- linux高级程序_进程间通信
- Intent filter
- 什么是动态规划?动态规划典型例题求解+代码
- 找出数组中的重复元素
- 导出jar包
- Netty