默认
发表评论 9
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] 求教MobileIMSDK客户端消息传递时QoS应答机制的疑问
问题描述
         服务端 在云端(华为云)
         多个客户端分布在不同的服务器(不同ip)中,同时连接服务端
         客户端之间的消息传递,MessageQoSEventImpl(消息送达相关事件(由QoS机制通知上来的)在此MessageQoSEvent子类中实现即可)来记录消息接受情况
         出现的问题是:客户端接收到了消息,但发送者通过MessageQoSEventImpl并未监听到接收者是否收到了消息
         结果:有时能监听到messagesBeReceived messagesLost方法
                    大部分监听不到 messagesBeReceived messagesLost方法      
         疑问:客户端之间消息发送,接受者是否需要通过 ChatMessageEventImpl类onRecieveMessage方法给发送者发送(类似我已接收)的回执消息,发送者才能监听到 MessageQoSEventImpl

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

微信图片_20210603101642.png (67.19 KB, 下载次数: 2768)

微信图片_20210603101642.png
上一篇:[已回复]为什么我登录MobileIMSDK的时候显示用户名和密码都为空下一篇:[已回复] 求教MobileIMSDK写的IM客户端会话超时失效提示的疑问
推荐方案
评论 9
理论上,只要你发送时,指明QoS参数为true(即表示需要QoS机制),则每条消息都会由SDK底层自动实现消息的应答。你说的有收能收到应答,有时收不到,理论上不可能。

你可以在gitee上把源码下载下来,在源码的基础上边调试,边观察,这样更具体一点。

MobileIMSDK的QoS的原理就是:

  • 1)你发出一条消息后,此消息会自动进入到 QoS发送保证队列,代码实现是 QoS4SendDaemon.java
  • 2)对方收到消息后,会由发送应答包;
  • 3)发者者收到应答包后,会在QoS接收机制中移除这条消息(在第1)步中加入的),代码实现是 QoS4ReciveDaemon.java
  • 4)当第3)步没有发生,也就是发送者没有收到接收者发过来的应答包时,第1)步中的QoS列队,会自动计算机这条消息在超时时间内没有收到应答包,并决定进行重传(进入重传逻辑)。

以上就是QoS机制的大致原理,你可以按我说的,去读一下或调试一下代码。代码是很精确的,该是怎么样就是怎么样,有时能有时又不能,那一定是有别的原因,你可以深究一下。

你在研究的过程中,如果遇到任何技术疑问,你就在就在这个帖子里回复,有必要的话就新开一贴,我看到后会及时详细帮你分析。
引用:JackJiang 发表于 2021-06-02 21:36
理论上,只要你发送时,指明QoS参数为true(即表示需要QoS机制),则每条消息都会由SDK底层自动实现消息的 ...

这是我发送消息Qos true

p = ProtocalFactory.createCommonData(message.toString(), from_user_id, to_user_id, true, null);

图是我发送的消息日志,根据操作指令结果与描述侧面反映了我的问题描述
根据您的思路我调试下具体代码,跟踪下问题。

微信图片_20210603101642.png (67.19 KB, 下载次数: 2791)

微信图片_20210603101642.png
引用:JackJiang 发表于 2021-06-02 21:36
理论上,只要你发送时,指明QoS参数为true(即表示需要QoS机制),则每条消息都会由SDK底层自动实现消息的 ...

根据您的建议我会调试下
引用:hlf520 发表于 2021-06-03 10:29
根据您的建议我会调试下

嗯,有情况及时在帖子里讨论
引用:hlf520 发表于 2021-06-03 10:24
这是我发送消息Qos true

p = ProtocalFactory.createCommonData(message.toString(), from_user_id, t ...

你这日志是用什么工具抓取的,很实用啊
引用:JackJiang 发表于 2021-06-03 10:36
你这日志是用什么工具抓取的,很实用啊
1:日志是通过消息送达相关事件(由QoS机制通知上来的)在此MessageQoSEvent子类中实现即可记录到关系表中的
2:问题少描述了一个在项目实施过程中的细节服务端与客户端在同一网段内,没有出现过上述问题
引用:JackJiang 发表于 2021-06-03 10:36
你这日志是用什么工具抓取的,很实用啊

日志是通过MessageQoSEventImpl记录到关系表中的
引用:JackJiang 发表于 2021-06-02 21:36
理论上,只要你发送时,指明QoS参数为true(即表示需要QoS机制),则每条消息都会由SDK底层自动实现消息的 ...

线上,线下分别做了测试
结论:Qos机制没有问题,是我拿到消息后处理的问题(在操作数据库执行方法是不是同一事务造成)
引用:hlf520 发表于 2021-06-05 11:42
线上,线下分别做了测试
结论:Qos机制没有问题,是我拿到消息后处理的问题(在操作数据库执行方法是不 ...

好的,明白了。后面再遇到别的技术问题,直接开贴即可
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部