Android源码分析之Exchange的PUSH技术理解

Android源码分析之Exchange的PUSH机制

摘要

本文是一篇介绍Exchange中PUSH机制的文章。首先,简要介绍了PUSH是什么以及当前流行的Push技术;然后,介绍了Exchange的Push技术——Direct Push;最后,简要介绍了Android系统中对Exchange中PUSH技术的客户端实现。本文希望通过这篇文章可以完成对Exchange中PUSH技术的简要介绍,并达到快速了解Android系统中Exchange应用对PUSH机制的客户端实现。

关键词

PUSH技术、Exchange、Direct PUSH、Exchange实现

一、PUSH概述

所谓PUSH技术是一种基于客户端 / 服务器机制,由服务器主动的将信息发往客户端的技术。同传统的拉技术(PULL)相比,两者最为主要的区别在于前者的是由服务器主动发送信息,而后者则是由客户机主动请求信息。在PUSH应用中,在服务器发送内容给客户机之前,没有明显的客户机请求,也就是说,PUSH事务是由服务器发起的。
换个角度,PUSH保证了实时性。在当前时候,PUSH技术被广泛使用,例如Google的Google Cloud Message(GCM服务)、Apple的Apple Push Notification service(APNs)等。当服务器有消息到来时,服务器会推送通知给客户端,客户端主动来获取消息,已达到实时推送的目的。
本文将重点对Exchange的PUSH技术进行介绍。

二、Exchange中的PUSH机制

Exchange是微软出品的。坏处就是不开源,好处的就是文档多。在本章节中,大部分来自于微软的官方网站中的内容。

2.1 Exchange的Direct Push

Exchange的PUSH机制,微软称之为Direct Push技术。该技术依据HTTP/HTTPS长链接保证客户端与服务器可以随时通信,从而达到服务器有数据发生变化时,可以保证客户端及时获取到新变化的数据。上述为我自己的理解,微软给出的【DirectPush】说明如下:

By default, Direct Push is enabled in Exchange 2013. Mobile devices that support Direct Push issue a long-lived HTTPS request to the server running Microsoft Exchange. The Exchange server monitors activity on the user's mailbox and sends a response to the mobile device if there are any changes, such as new or changed email, calendar, contact, or task items. If changes occur within the lifespan of the HTTPS request, the Exchange server issues a response to the device that states that changes have occurred and the device should initiate synchronization with the Exchange server. The device then issues this request to the server. When synchronization is complete, a new long-lived HTTPS request is generated to start the process again. This guarantees that email, calendar, contact, and task items are delivered quickly to the mobile device, and that it is always synchronized with the Exchange server.

在引用的上文中,the lifespan of the HTTPS request是由心跳间隔(HeartbeatInterval)来指定。下面将介绍一下心跳间隔的概念。

2.2 心跳间隔(HeartbeatInterval)

这里的心跳间隔是EAS协议中Ping命令中的一个属性,该属性定义了一个时间值。这个时间值是Exchange服务器收到Ping命令后,如果Ping命令中指定的Folder没有更新,那么服务器应该等待的时间长度。当然,这里的应该是要注意的,有些Exchange服务器并不会等待这个时间。例如,163的Exchange服务器(i.163.com)在收到一个心跳间隔在8min到28min范围内的心跳间隔,如果指定的Folder没有更新,那么其只会等待1min左右,就返回了响应。
微软对心跳间隔(HeartbeatInterval)给出了一下解释【Ping_HI】:

The HeartbeatInterval element is a child element of the Ping element in Ping command requests and responses. In Ping command requests, it specifies the length of time, in seconds, that the server SHOULD wait before sending a response if no new items are added to the specified set of folders, as specified in section 3.1.5.8. The HeartbeatInterval element is also returned by the server with a status code of 5 and specifies either the minimum or maximum interval that is allowed when the client has requested a heartbeat interval that is outside the acceptable range.

心跳间隔受到较多因素的影响。其中客户端设置、服务器对心跳间隔范围的限制比较容易理解。此外还受到网络的影响。例如大部分移动无线网络运营商都在链路一段时间没有数据通讯时,会淘汰NAT表中的对应项,造成链路中断,从而导致客户端不能受到服务器的响应。在网络中找到了一份数据通信运营商网络的NAT超时时间,如下【NAT

地区/网络 NAT超时时间
中国移动3G和2G 5分钟
中国联通2G 5分钟
中国电信3G 大于28分钟
美国3G 大于28分钟
台湾3G 大于28分钟

对Exchange的Direct Push有了一个基本概念后,下面将介绍一下Direct Push的一个工作流程。

2.3 Direct Push的工作流程

在这里,微软官方给出了一个Direct Push中客户端和服务器的交互图,如下图【TC34591】所示:

image
image

该流程的描述如下:

  1. 客户端发起一个HTTP请求(使用的是EAS的Ping命令),设置心跳间隔为15分钟。
  2. 服务器收到该请求,并挂起。当心跳间隔内PIM(Personal Information Manager, 个人信息管理系统)没有变动,则返回一个状态码为200的HTTP响应。
  3. 客户端收到该响应,解析。解析结果为服务端没有变化。
  4. 继续对客户端发送一个一个HTTP请求(使用的是EAS的Ping命令),设置心跳间隔为15分钟
  5. 服务器收到该请求,并挂起。在挂起该请求的13分钟时监听到Folder X有新邮件。把该消息封装到HTTP响应中反馈给客户端。
  6. 客户端收到该响应,解析。解析结果为服务端到Folder X有变化。
  7. 客户端发起同步Folder X的同步操作。

到这里,就简要介绍完了Exchange的Direct Push技术。下面,将介绍Exchange应用中如何实现了该技术中的客户端部分。

三、Android的Exchange应用对Direct Push的客户端实现

在Exchange应用中,Direct Push的客户端的实现重点涉及三个类:EasPingPingTaskPingSyncSynchronizer。当然还有一个类,EasService,是Exchange整个客户端功能的集合,不算在Direct Push的实现部分。其中这三个类各自的作用如下表所示:

Java类 功能
EasPing 完成Direct Push中一次HTTP/HTTPS长连接交互所负责的内容
PingTask 如果服务器没有变化,循环执行EasPing,保证客户端实时在线
PingSyncSynchronizer 管理客户端与服务器交互,保证任意时刻,最多只有一个HTTP/HTTPS请求在与服务器交互

这三个类的具体实现部分请查阅源代码(该文源代码依据Android原生代码)。

首先,来说一下Exchange的正常同步操作。

3.1 正常的同步操作

当系统尝试对某个账户执行同步操作(pushModify不算,这只是单纯的PingTask操作),首先,等待当前账户与服务器的交互停止(这部分由PingSyncSynchronizer负责处理)。如果与服务器的交互命令是Ping,则终止Ping操作;如果是其它命令,等待该命令的完成。然后,执行系统的同步操作。最后,同步操作完成后,如果该账户设置为Push(实时更新邮件),那么执行PingTask任务;否则,结束同步流程。PingTask任务保证客户端实时在线,以便实时收取新邮件。PingTaskPingSyncSynchronizer对象启动,而PingSyncSynchronizerEasService的成员属性。

在整个同步过程中,实际上参与Direct Push的部分是PingTask。那下面就讲述一下PingTask的工作机制。

3.2 PingTask的工作机制

在用户不进行操作的前提下,如果服务器中没有数据更新且外界环境正常(外界环境包含网络状态,Exchange的响应等),PingTask会循环做Ping操作。如果服务器数据更新,那么客户端会接收到响应,会对更新的Folder请求同步操作,并结束PingTask。其中更新的Folder请求同步操作实际上是走一次正常的同步流程。如果出现异常,例如网络超时等,也会做相应操作。例如网络超时,PingTask会结束当前PingTask执行,并请求系统做PUSH_ONLY同步。该同步并不会真正做同步操作,而是执行PingSyncSynchronizerpushModify。也就是在不进行同步操作的前提下保证PingTask任务开启。有关其余异常的处理,请参考PingTaskEasPing两个类。

3.3 心跳间隔的调节

如果服务器在上个Ping操作的过程中,服务器没有信息更新,那么下一个心跳间隔会默认增长5min,直到达到了设置的心跳间隔最大值(28min)。如果在上个Ping操作中出现了IO异常(例如网络超时等),那么下一个心跳间隔会默认减少5min,直到达到了设置的心跳间隔最小值(8min)。实际上,当出现了IO异常,当前的PingTask就会结束。

四、总结

虽然本文名称是《Android源码分析之Exchange的PUSH技术理解》,实际上并没有涉及多少Android的Exchange源码介绍。总起来说,Exchange应用对Direct Push的客户端实现比较简单。其中涉及的类中的代码逻辑也不复杂。本文就介绍到这里。
在当前社会中,Push技术被广泛的应用。通过对Exchange的Push机制的学习,也会对这些技术有一些笼统的概念。这样,方面我们接触了解这些技术。

参考文献

本文中有些内容是自己的理解,如有不准确请指出,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容