public class QoS4SendDaemonRoot
extends java.lang.Object
当前QoS机制支持全部的C2C、C2S、S2C共3种消息交互场景下的消息送达质量保证:<>
TCP理论上能从底层保证数据的可靠性,但应用层的代码和场景中存在网络本身和网络之外的各种不可靠性,
MobileIMSDK中的QoS送达保证机制,将加强TCP的可靠性,确保消息,无法从哪一个层面和维度,都会给
开发者提供两种结果:要么明确被送达(即收到ACK应答包,见
MessageQoSEventListenerS2C.messagesBeReceived(String)
)、要行明确未被送达(见
MessageQoSEventListenerS2C.messagesLost(ArrayList)
)。从理论上,保证消息的百分百送达率。
一个有趣的问题:TCP协议为什么还需要消息送达保证机制?它不是可靠的吗?
是的,TCP是可靠的,但那是在底层协议这一层。但对于应用层来说,TCP并不能解决消息的百分百可靠性。
原因有可能是:
1)客户端意外崩溃导致TCP缓冲区消息丢失; 2)网络拥堵,导致TCP反复重传并指数退避,导致长时间无法送达的也应在送达超时时间内被判定为无法送 达(对于应用层来说tcp传的太慢,用户不可能等的了这么久,否则体验会很差); 3)中间路由故障,tcp本身是无法感知的,这种情况下tcp做传输重试也会出现2)中的情况,这也应算是事 实上的无法送达; 4)其它更多情况。
当前MobileIMSDK的QoS机制支持全部的C2C、C2S、S2C共3种消息交互场景下的消息送达质量保证.
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
QoS4ReciveDaemonC2S
,
MessageQoSEventListenerS2C
构造器和说明 |
---|
QoS4SendDaemonRoot(int CHECH_INTERVAL,
int MESSAGES_JUST$NOW_TIME,
int QOS_TRY_COUNT,
boolean DEBUG,
java.lang.String debugTag) |
限定符和类型 | 方法和说明 |
---|---|
boolean |
exist(java.lang.String fingerPrint)
该包是否已存在于队列中。
|
boolean |
isDebugable() |
boolean |
isRunning()
线程是否正在运行中。
|
protected void |
notifyMessageLost(java.util.ArrayList<Protocal> lostMessages)
将未送达信息反馈给消息监听者。
|
void |
put(Protocal p)
推入一个消息包的指纹特征码.
|
void |
remove(java.lang.String fingerPrint)
移除一个消息包.
|
QoS4SendDaemonRoot |
setDebugable(boolean debugable) |
void |
setServerLauncher(ServerLauncher serverLauncher)
设置用于QoS事件中没有实时重传成功的消息的回调通知事件宿主。
|
int |
size()
队列大小.
|
QoS4SendDaemonRoot |
startup(boolean immediately)
启动线程。
|
void |
stop()
无条件中断本线程的运行。
|
public QoS4SendDaemonRoot(int CHECH_INTERVAL, int MESSAGES_JUST$NOW_TIME, int QOS_TRY_COUNT, boolean DEBUG, java.lang.String debugTag)
protected void notifyMessageLost(java.util.ArrayList<Protocal> lostMessages)
lostMessages
- 已被判定为“消息未送达”的消息列表ServerLauncher.getServerMessageQoSEventListener()
public QoS4SendDaemonRoot startup(boolean immediately)
无论本方法调用前线程是否已经在运行中,都会尝试首先调用 stop()
方法,
以便确保线程被启动前是真正处于停止状态,这也意味着可无害调用本方法。
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
immediately
- true表示立即执行线程作业,否则直到 CHECH_INTERVAL
执行间隔的到来才进行首次作业的执行public void stop()
本线程的启停,目前属于MobileIMSDK算法的一部分,暂时无需也不建议由应用层自行调用。
public boolean isRunning()
public boolean exist(java.lang.String fingerPrint)
fingerPrint
- 消息包的特纹特征码(理论上是唯一的)public void put(Protocal p)
p
- public void remove(java.lang.String fingerPrint)
fingerPrint
- 消息包的特纹特征码(理论上是唯一的)public int size()
HashMap.size()
public void setServerLauncher(ServerLauncher serverLauncher)
请在本类调用 startup(boolean)
前设置之,否则当实时重传
没有成功时,无法发出回调通知哦。
public QoS4SendDaemonRoot setDebugable(boolean debugable)
public boolean isDebugable()