Skip to content

Online 在线管理

本文档描述 Zeze 在线状态管理模块 Online 的表结构、状态常量、事件机制、可靠消息、消息发送与跨服转发接口,供在线业务开发检索参考。

模块包路径说明
OnlineZeze.Arch.Online基于账号的在线状态管理,跟踪登录登出、维护本机数据、发送在线消息、跨服查询转发
OnlineZeze.Game.Online游戏场景,以 roleId 为键,增加 LinkBrokenEvents / OnlineSet 扩展

在线状态以 (account, clientId) 唯一标识,clientId 允许多端。

作用范围
_tonline全局 BOnlines,记录 LinkName / LinkSid / 状态 / LoginVersion,所有 Server cache-sync 共享全局共享
_tlocal本机 BLocals,仅当前 Server 内存表本机内存
ReliableNotifyQueue可靠消息队列,持久化断线补发本机
常量含义
eOffline0离线
eLinkBroken1链路断开
eLogined2已登录
online.isOnline(account); // 账号是否在线
online.isOnline(account, clientId); // 指定端是否在线
online.getState(); // 获取状态
接口事务要求说明
setLocalBean(account, clientId, key, bean)必须事务内设置本机数据(带 clientId、key)
getLocalBean(account, clientId, key)-获取本机数据
getOrAddLocalBean(account, clientId, key, supplier)必须事务内获取或添加(带 clientId、key 与默认值构造器)
removeLocalBean(account, clientId, key)-移除本机数据
walkLocal((k, v) -> {...})事务外遍历本机数据,返回 false 中断

注意:setLocalBeangetOrAddLocalBean 必须在事务内;walkLocal 不在事务中执行。

四种事件类型:

事件触发时机
LoginEvents首次登录
ReloginEvents断线重连
LogoutEvents登出(含补发)
LocalRemoveEvents本机数据删除

事件分三阶段触发:triggerEmbedtriggerProceduretriggerThread

online.getLoginEvents().run((sender, arg) -> {
// 返回 0 成功
return 0;
});

服务器异常关闭时无法触发 Logout。下一次 Login 发现上一个没 Logout,会先补发 LogoutLogin(用 done 标志循环重试)。Logout 可能与 Login 时间相隔很远,精确时间统计不应完全依赖该机制。

可靠消息需客户端确认,先持久化到队列再发送。

接口说明
addReliableNotifyMark(account, clientId, listenerName)启用通道(带 account、clientId、listenerName)
sendReliableNotify(p)发送可靠消息
sendReliableNotifyWhileCommit(p)事务提交时发送
sendReliableNotifyWhileRollback(p)事务回滚时发送
removeReliableNotifyMark(account, clientId, listenerName)关闭通道

Relogin 时未确认消息同步;runTaskOneByOneByKey 串行化,保证按序。

接口说明
send(account, clientId, p)发送(三参数:account、clientId、协议)
sendWhileCommit事务提交时发送
sendWhileRollback事务回滚时发送
sendResponse发送响应
sendResponseWhileCommit事务提交时发送响应

目标不在线时静默跳过。底层 sendDirect 查表找 LinkName / LinkSid,经 Linkd 转发,失败触发 sendError

SendToAccount(发送给账号所有登录端)

Section titled “SendToAccount(发送给账号所有登录端)”
接口说明
online.sendAccount(p)发给账号所有登录端
online.sendAccounts(p)按账号列表发送,按 LinkName 分组批量
接口说明
transmit(senderAccount, senderClientId, actionName, targetAccount, targetClientId, parameter)跨服转发

注册 action:

online.getTransmitActions().put("queryBag", (sender, senderClientId, targetAccount, targetClientId, parameter) -> {
// 处理查询
return 0;
});

transmitWhileCommit / transmitWhileRollback 对应事务时机。未启用 cache-sync 时,单机直接本地执行。

向当前 Provider 所有 Linkd 广播,每个 Linkd 转发其客户端。

接口说明
broadcast(p)广播
broadcast(p, time)去重窗口(默认 60 秒)
broadcast(p, true)仅同版本
broadcast(p, time, onlySameVersion)去重 + 同版本
接口说明
getOnline / getOrAddOnline获取/新增在线记录
getLogin获取登录信息
getAccountLoginCount账号登录端数量
isAccountLogin账号是否登录
getLoginVersion / getLogoutVersion / getLocalLoginVersionLoginVersion 单调递增,判断登录数据新旧
bindDynamic(account, clientId, moduleId1, moduleId2)动态模块绑定

linkBroken 设为 eLinkBroken,启动延迟登出定时器(Config.OnlineLogoutDelay)。期间 Relogin 可取消登出;超时则正式 Logout

扩展说明
OnlineSetcreateOnlineSet(name) 创建多个独立在线集合
LinkBrokenEvents链路断开事件(LinkBrokenArgument(roleId)
UserDatasetUserData / getUserData 挂载自定义 Bean
TimerRole角色定时器
sendAllOnlines向所有 OnlineSet 尝试发送