iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架; Java Netty Game Server.
http://game.iohao.com
GNU Affero General Public License v3.0
920 stars 205 forks source link

获取所有活跃用户 #336

Closed molin7596 closed 4 months ago

molin7596 commented 4 months ago

这样获取是只获取到绑定到这个对外服的用户吗?有其他方法获取所有活跃用户吗?

public final class OnlineUserExternalBizRegion implements ExternalBizRegion {

    @Override
    public int getBizCode() {
        return ExternalBizCode.onlineUser;
    }

    @Override
    public Serializable request(ExternalBizRegionContext regionContext) throws MsgException {
        UserSessions<?, ?> userSessions = regionContext.getUserSessions();
        OnlineUser onlineUser = new OnlineUser();
        userSessions.forEach(userSession -> {
            if (userSession.isActive()) {
                onlineUser.add(userSession.getUserId());
            }
        });
        return onlineUser;
    }
}
iohao commented 4 months ago

你的示例是正确的,这是获取游戏对外服的数据与扩展 (yuque.com)的正确方式。

molin7596 commented 4 months ago

好的,谢谢, 但是我想了解的是 :“有方法获取所有的活跃用户吗?”,这样获取只有当前对外服的

iohao commented 4 months ago

ResponseCollectExternalMessage 收集的是各游戏对外服中获取的数据。

action 示例中触发 OnlineUserExternalBizRegion 相关逻辑。

@ActionController(ExternalBizRegionCmd.cmd)
public class ExternalBizRegionAction {
    ... ...省略部分代码

    @ActionMethod(ExternalBizRegionCmd.listOnlineUser)
    public List<Long> listOnlineUser(FlowContext flowContext) {
        // 访问玩家所在的【游戏对外服】
        ResponseCollectExternalMessage collectExternalMessage = flowContext
                .invokeExternalModuleCollectMessage(MyExternalBizCode.onlineUser);

        return listUserId(collectExternalMessage);
    }

    @ActionMethod(ExternalBizRegionCmd.listOnlineUserAll)
    public List<Long> listOnlineUserAll(FlowContext flowContext) {

        // 访问多个【游戏对外服】
        var request = new RequestCollectExternalMessage()
                .setBizCode(MyExternalBizCode.onlineUser);

        ResponseCollectExternalMessage collectExternalMessage = flowContext
                .invokeExternalModuleCollectMessage(request);

        return listUserId(collectExternalMessage);
    }

    private static List<Long> listUserId(ResponseCollectExternalMessage collectExternalMessage) {
        List<Long> userIdList = new ArrayList<>();
        // 打印从各游戏对外服中获取的数据
        for (ResponseCollectExternalItemMessage itemMessage : collectExternalMessage.getMessageList()) {
            // OnlineUserExternalBizRegion 所返回的数据
            OnlineUser onlineUser = itemMessage.getData();

            List<Long> userIds = onlineUser.getUserIds();
            log.info("userIds : {}", userIds);

            userIdList.addAll(userIds);
        }

        return userIdList;
    }
}

可尝试运行相关示例 获取游戏对外服的数据与扩展 (yuque.com)

molin7596 commented 4 months ago

好的