默认
发表评论 2
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] 求教MobileSDK的GlobalSendHelper中消息去复逻辑的疑惑
阅读(15737) | 评论(2 收藏1 淘帖1 1
else {[问题描述:在这个处理逻辑中,是处理发送C2C消息给在本机的在线用户,但是,这里并没有重复消息的处理判断逻辑,而在处理不在本机的情况时却是有重复消息处理逻辑的,也就是会判断消息是否接受过{QoS4ReciveDaemonC2S.getInstance().hasRecieved(pFromClient.getFp())}所以想知道,下面这段代码为什么没有进行重复消息处理    //回调
    MBObserver resultObserver = new MBObserver() {
        @Override
        public void update(boolean sendOK, Object extraObj) {
            boolean needAck = false;

            if (sendOK) {
                needAck = true;
                serverCoreHandler.getServerEventListener().onTransferMessage4C2C(pFromClient);
            } else {
                logger.info("[IMCORE-{}<C2C>]>> 客户端{}的通用数据尝试实时发送没有成功,将交给应用层进行离线存储哦..."
                        , Gateway.$(session), remoteAddress);

                //由应用层完成离线消息处理。。
                boolean offlineProcessedOK = serverCoreHandler.getServerEventListener().onTransferMessage_RealTimeSendFaild(pFromClient);
                if (pFromClient.isQoS() && offlineProcessedOK) {
                    needAck = true;
                } else {
                    logger.warn("[IMCORE-{}<C2C>]>> 客户端{}的通用数据传输消息尝试实时发送没有成功,但上层应用层没有成功(或者完全没有)进行离线存储,此消息已被服务端丢弃!", Gateway.$(session), remoteAddress);
                }
            }

            //接收到客户端的消息,并且完成处理之后,发送ack给客户端
            if (needAck) {
                try {
                    MBObserver retObserver = new MBObserver() {
                        @Override
                        public void update(boolean sucess, Object extraObj) {
                            if (sucess) {
                                logger.debug("[IMCORE-{}<C2C>]QoS_伪应答_C2S】向{}发送{}的应答包成功,from={}."
                                        , Gateway.$(session), pFromClient.getFrom(), pFromClient.getFp(), pFromClient.getTo());
                            }
                        }
                    };

                    LocalSendHelper.replyRecievedBack(session, pFromClient, retObserver);
                } catch (Exception e) {
                    logger.warn(e.getMessage(), e);
                }
            }
        }
    };

    LocalSendHelper.sendData(pFromClient, resultObserver);
}


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

本帖已收录至以下技术专辑

推荐方案
评论 2
这个逻辑可能有点复杂。
本机的消息,去重逻辑是的客户端的QoS机制里判定和处理的。
不在本机的消息(也就是与MobileIMSDK-Web的互通消息),因为涉及到QoS的复杂性,所以它的处理逻辑是在服务端处理的(原理就是:这个消息是由MobileIMSDK服务端转发给MobileIMSDK-Web的服务端,从某种角度来说,它也就是此条消息的转发“客户端”)。
引用:JackJiang 发表于 2023-07-31 21:25
这个逻辑可能有点复杂。
本机的消息,去复逻辑是的客户端的QoS机制里判定和处理的。不在本机的消息,因为 ...

懂了,谢谢站长
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部