默认
发表评论 8
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
回帖奖励 18 金币      回复本帖可获得 6 金币奖励! 每人限 2 次
rabbitmq 貌似一段时间后 会断开跟MobileIMSDK主服务器的连接
JackJiang ,你好,现在碰到一个问题,查了很多资料没有解决,恳请帮忙看下,不甚感激
我们用了你的web版im服务器和MobileIMSDK主服务器通过rabbitmq进行通信。
现在发现一个问题。MobileIMSDK主服务器运行一段时间,可能是24小时以后,可能是更久一点后,必然会出现与rabbitmq失去连接。要重启MobileIMSDK主服务器才可以,重启后马上就好了。
我用的rabbitmq和erLang的版本都是你推荐的那款。

我看了相关代码:
final Channel resumeChannel = conn.createChannel();
    String queueName = this.consumFromQueue;//queue name
   
    DefaultConsumer dc = new DefaultConsumer(resumeChannel)
@Override
     public void handleDelivery(String consumerTag,Envelope envelope,
       AMQP.BasicProperties properties,byte[] body)throws IOException{  //这个方法体没有抛出异常

启动的时候会去创建,那一般都是一直存在的。我观测到出现问题的时候,rabbitmq上面有几十个ready未消费的消息,但是 消费者个数是0,即此时没有Consumer,这个是为什么啊。。。我做了日志,handleDelivery方法体里边是正常的,没有什么异常记录
rabbitmq空闲没消息一段时间后,貌似会删掉我们的这个consumer

我网上查了一些资料,说是加resumeChannel.basicQos(1);   以及先主动act再处理消息,貌似都没用啊。跑一段时间,都要重启MobileIMSDK主服务器才会正常。而web版的im服务器没有问题。

服务器是阿里云的windows 2008 r2,软件版本都是你推荐的那些版本
前一段时间还从官方下载了最新版的MobileIMSDK主服务器代码,rabbitmq的work里边的相关代码跟旧版是一样的。

这个问题已经困扰了我们很久了,没有解决,现在也比较急。所以寻求原作者帮忙指导下。谢谢了。



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

上一篇:[已回复] MobileIMSDK移动端是否可实现创建、删除群聊,新消息提示?下一篇:[已回复] 请问mobileIMSDK里有视频会议的吗?
推荐方案
评论 8

回帖奖励 +6 金币

不用着急,我来引导你排查问题。

你所遇到的问题,其他客户都没有遇到,是有点费解了。不过,你按照我的思路,来排查问题,应该能找出原因。

首先:MobileIMSDK的RabbitMQ的消费者这边,使用的是RabbitMQ官方的连接库,是每隔30秒有心跳检查的。

所以:如果连接跟RabbitMQ断开,则MobileIMSDK是一定会有异常抛出。

那么:为了抓出有价值的异常信息,建议你服务端什么事也不会,把服务端开着,就等着这个异常发生,然后把这个异常发生的前后10分钟左右的所有日志全部抓出来(一定要完整!)

你抓出完整log后,我来帮你分析分析!

我之前就已经做了这个工作,但是没有异常抛出啊,日志里面都没有记录到
我这个问题就是,启动后可能几十个小时内都是正常的。后面程序有空闲了好几个小时 就这样了
看看还有什么排查方法,还有什么地方要排查的,实在不知道怎么搞了

rabbitmq 貌似一段时间后 会断开跟MobileIMSDK主服务器的连接_ttttt.png
签名: 试试看签到6个字
im主服务器其他部分都是正常的,包括用户离在线什么的 都正常,就是rabbitmq这块 没连上状态了
签名: 试试看签到6个字

回帖奖励 +6 金币

引用:963536541 发表于 2018-09-09 18:38
我之前就已经做了这个工作,但是没有异常抛出啊,日志里面都没有记录到
我这个问题就是,启动后可能几十 ...

没有异常抛出,那你怎么知道或说它断开了?另外,你贴这段代码是要说明什么吗,这是你自已写的吧,有什么作用?
那段代码是我蛮加上去的也没什么用。
我是看rabbitmq上面 ready状态的还有56个,但是提示一个消费者都没有了。重启后消费者为1
还有什么办法可以跟踪的吗
签名: 试试看签到6个字
引用:963536541 发表于 2018-09-09 20:15
那段代码是我蛮加上去的也没什么用。
我是看rabbitmq上面 ready状态的还有56个,但是提示一个消费者都没有 ...

我给你的最佳建议就是:
想尽办法抓到你所观察到的与mq断开连接之前、之后的异常log(你说没有异常信息,那是不可能的,一定会有,没抓到意味着你观察的还不够仔细)。

替代方案就是:
实在不行,你可以写一个守护线程,隔个半分钟或1分钟,向mq队列中放入一条心跳消息(消费者那边读到这个消息心跳的消息类型就扔掉就行了),因为隔这么长时间就一条心跳消息而已,所以性能上等方方面面也没有什么额外的开销,可以忽略不计,在问题找出来之前也算是一个可以接受的方案。
好的。先谢谢了
签名: 试试看签到6个字
问题解决了,分享一下:

boolean autoAck = false;
resumeChannel.basicQos(1);//加这句就行了
resumeChannel.basicConsume(queueName, autoAck,dc);

不加resumeChannel.basicQos(1);的话 ,一段时间后消费者会收不到消息,要重启,亲测过
签名: 试试看签到6个字
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部