Smalldok's Tech Blog

穷则变、变则通、通则达


  • 首页

  • 分类

  • 关于

  • 标签

  • 归档

  • 公益 404

  • 搜索

4-快速连接 FAST_CONNECT

| 分类于 源码学习 , MPush , 源码分析 , Mpush Server , 接入服务 | 评论数: | 阅读次数:
1
2
//ConnectionServer#init()
messageDispatcher.register(Command.FAST_CONNECT, () -> new FastConnectHandler(mPushServer));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public final class FastConnectHandler extends BaseMessageHandler<FastConnectMessage> {
private final ReusableSessionManager reusableSessionManager;

public FastConnectHandler(MPushServer mPushServer) {
this.reusableSessionManager = mPushServer.getReusableSessionManager();
}

@Override
public FastConnectMessage decode(Packet packet, Connection connection) {
return new FastConnectMessage(packet, connection);
}

@Override
public void handle(FastConnectMessage message) {
//从缓存中心查询session
Profiler.enter("time cost on [query session]");
ReusableSession session = reusableSessionManager.querySession(message.sessionId);
Profiler.release();
if (session == null) {
//1.没查到说明session已经失效了
ErrorMessage.from(message).setErrorCode(SESSION_EXPIRED).send();
Logs.CONN.warn("fast connect failure, session is expired, sessionId={}, deviceId={}, conn={}"
, message.sessionId, message.deviceId, message.getConnection().getChannel());
} else if (!session.context.deviceId.equals(message.deviceId)) {
//2.非法的设备, 当前设备不是上次生成session时的设备
ErrorMessage.from(message).setErrorCode(INVALID_DEVICE).send();
Logs.CONN.warn("fast connect failure, not the same device, deviceId={}, session={}, conn={}"
, message.deviceId, session.context, message.getConnection().getChannel());
} else {
//3.校验成功,重新计算心跳,完成快速重连
int heartbeat = ConfigTools.getHeartbeat(message.minHeartbeat, message.maxHeartbeat);
session.context.setHeartbeat(heartbeat);

Profiler.enter("time cost on [send FastConnectOkMessage]");
FastConnectOkMessage
.from(message)
.setHeartbeat(heartbeat)
.sendRaw(f -> {
if (f.isSuccess()) {
//4. 恢复缓存的会话信息(包含会话密钥等)
message.getConnection().setSessionContext(session.context);
Logs.CONN.info("fast connect success, session={}, conn={}", session.context, message.getConnection().getChannel());
} else {
Logs.CONN.info("fast connect failure, session={}, conn={}", session.context, message.getConnection().getChannel());
}
});

Profiler.release();
}
}
}



接入服务文章目录:

  • 1-心跳 HEARTBEAT
  • 2-握手 HANDSHAKE
  • 3-用户绑定-解绑 BIND-UNBIND
  • 4-快速连接 FAST_CONNECT
  • 5-客户端推送 PUSH
  • 6-消息确认 ACK
  • 7-HTTP代理 HTTP_PROXY
1…757677…100
smalldok

smalldok

JAVA服务端架构,目前方向是微服务落地、基础设施、中间件、DevOps

100 日志
27 分类
17 标签
Links
  • sofa-bolt
  • sofa-rpc
  • dubbo
  • sofa-tracer
  • sofa-boot
  • Sentinel
  • COLA
  • nacos
  • xxl-job
  • apollo
  • sharding-sphere
  • fescar
  • ByteTCC
  • tcc-transaction
  • rocketmq
  • canal
  • arthas
  • jvm-sandbox
  • sofa-lookout
  • disruptor
  • mpush
© 2007 – 2019 smalldok
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Mist v6.7.0