public class QoS4ReciveDaemon
extends java.lang.Object
原理是:当收到需QoS机制支持消息包时,会把它的唯一特征码(即指纹id)存放于本类的“已收到”消息队列中,寿命
约为 MESSAGES_VALID_TIME
指明的时间,每当CHECH_INTERVAL
定时检查间隔到来时会对其存活期进
行检查,超期将被移除,否则允许其继续存活。理论情况下,一个包的最大寿命不可能超过2倍的 CHECH_INTERVAL
时长。
补充说明:“超期”即意味着对方要么已收到应答包(这是QoS机制正常情况下的表现)而无需再次重传、要么是
已经达到QoS机制的重试极限而无可能再收到重复包(那么在本类列表中该表也就没有必要再记录了)。总之,“超期”是队列中
这些消息包的正常生命周期的终止,无需过多解读。
本类存在的意义在于:极端情况下QoS机制中存在因网络丢包导致应答包的丢失而触发重传机制从而导致消息重复,而本 类将维护一个有限时间段内收到的所有需要QoS支持的消息的指纹列表且提供“重复性”判断机制,从而保证应用层绝不会因为QoS 的重传机制而导致重复收到消息的情况。
当前MobileIMSDK的QoS机制支持全部的C2C、C2S、S2C共3种消息交互场景下的消息送达质量保证.
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
限定符和类型 | 字段和说明 |
---|---|
static int |
CHECH_INTERVAL
检查线程执行间隔(单位:毫秒),默认5分钟
|
static int |
MESSAGES_VALID_TIME
一个消息放到在列表中(用于判定重复时使用)的生存时长(单位:毫秒),默认10分钟
|
构造器和说明 |
---|
QoS4ReciveDaemon()
构造方法。
|
限定符和类型 | 方法和说明 |
---|---|
void |
addRecieved(net.x52im.mobileimsdk.server.protocal.Protocal p)
向列表中加入一个包的特征指纹。
|
void |
addRecieved(java.lang.String fingerPrintOfProtocal)
向列表中加入一个包的特征指纹。
|
void |
clear()
清空缓存队列。
|
java.util.Observer |
getDebugObserver()
!
|
static QoS4ReciveDaemon |
getInstance() |
boolean |
hasRecieved(java.lang.String fingerPrintOfProtocal)
指定指纹码的Protocal是否已经收到过.
|
boolean |
isInit()
本类对象是否已补初始化过。
|
boolean |
isRunning()
线程是否正在运行中。
|
void |
setDebugObserver(java.util.Observer debugObserver)
!
|
int |
size()
当前“已收到消息”队列列表的大小.
|
void |
startup(boolean immediately)
启动线程。
|
void |
stop()
无条件中断本线程的运行。
|
public static final int CHECH_INTERVAL
public static final int MESSAGES_VALID_TIME
public QoS4ReciveDaemon()
init()
public static QoS4ReciveDaemon getInstance()
public void startup(boolean immediately)
无论本方法调用前线程是否已经在运行中,都会尝试首先调用 stop()
方法,以便确保线程被启动前是真正处
于停止状态,这也意味着可无害调用本方法。
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
immediately
- true表示立即执行线程作业,否则直到 CHECH_INTERVAL
执行间隔的到来才进行首次
作业的执行public void stop()
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
public boolean isRunning()
public boolean isInit()
init
。public void addRecieved(net.x52im.mobileimsdk.server.protocal.Protocal p)
本方法的调用,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
p
- addRecieved(String)
public void addRecieved(java.lang.String fingerPrintOfProtocal)
本方法的调用,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
fingerPrintOfProtocal
- 消息包的特纹特征码(理论上是唯一的)putImpl(String)
public boolean hasRecieved(java.lang.String fingerPrintOfProtocal)
此方法用于QoS机制中在防止因网络丢包导致对方未收到应答时而再次发送消息从而导致消息重复时的判断依赖.
fingerPrintOfProtocal
- 消息包的特纹特征码(理论上是唯一的)public void clear()
调用此方法可以防止在APP不退出的情况下退出登陆MobileIMSDK时没有清除队列缓存,导致此时换用另一账号时发生数 据交叉。
public int size()
ArrayList.size()
public java.util.Observer getDebugObserver()
public void setDebugObserver(java.util.Observer debugObserver)
debugObserver
- DEBUG事件观察者