栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【GatewaySessionInactiveEvent事件】1.连接自己的客户端断开连接

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【GatewaySessionInactiveEvent事件】1.连接自己的客户端断开连接

1.必然是在自己的进程中才能监听到

2.GatewayRouteHandler的channelInactive中监听到自己的客户端断开连接,就会在里面抛出一个异步的事件

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        var session = SessionUtils.getSession(ctx);
        if (session == null) {
            return;
        }

        var sid = session.getSid();
        var uid = (Long) session.getAttribute(AttributeType.UID);
        // 异步事件
        EventBus.asyncSubmit(GatewaySessionInactiveEvent.valueOf(sid, uid == null ? 0 : uid.longValue()));

        super.channelInactive(ctx);
    }

3.在GatewayController.java中即可监听到事件进行处理即可

@Component
public class GatewayController {

    @EventReceiver
    public void onGatewaySessionInactiveEvent(GatewaySessionInactiveEvent event) {
        var sid = event.getSid();
        var uid = event.getUid();

        // 玩家如果没有登录,则不做任何处理
        if (uid <= 0) {
            return;
        }

        // 监听客户端断开连接
        var packet = LogoutRequest.valueOf();

        var loadBalancer = NetContext.getConfigManager().consumerLoadBalancer();

        // 这个是consumer连接着provider,因此:是可以找到consumer与provider之间的连接session的。 通过这个直接告诉
        var consumerSession = loadBalancer.loadBalancer(packet, uid);

        // 玩家登出
        var gatewayAttachment = new GatewayAttachment(sid, uid);
        // true: 是客户端掉线了
        gatewayAttachment.setClient(true);

        // rpc告诉所有服务器,这个人掉线了
        NetContext.getRouter().send(consumerSession, packet, gatewayAttachment);
    }

}

4.在gateway的application.xml中配置了多个消费者

  
            
            
        

应该是告诉他们 LoginOut的玩家客户端

5.在home的LoginController有监听

    @PacketReceiver
    public void atLogoutRequest(Session session, LogoutRequest request, GatewayAttachment gatewayAttachment) {
        logger.info("c[{}][{}]玩家退出游戏", gatewayAttachment.getUid(), gatewayAttachment.getSid());

        var uid = gatewayAttachment.getUid();
        var player = playerEntityCaches.load(uid);
        player.sid = 0;
        player.session = null;
        playerEntityCaches.update(player);
    }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/750384.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号