openfire在网络不好或掉线时消息丢失的处理方法

Posted 起个名字好难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openfire在网络不好或掉线时消息丢失的处理方法相关的知识,希望对你有一定的参考价值。

在服务端收到消息后增加如下代码

//保存到离线消息表,客户端收到后调用删除离线消息功能,这样可确保即使网络突然掉线或不好的情况下消息丢失的问题
OfflineMessageStore offlineMessageStore = new OfflineMessageStore();
offlineMessageStore.addMessage(message);

  

客户端在登录的时候要先设置为离线,收完离线消息后再改成在线模式。

接收方在收到每条消息后自己调用删除离线消息。

注意事项:

1、登录前要将状态设置为离线:

ConnectionConfiguration connectionConfig = new ConnectionConfiguration(192.168.1.82, 5222, "");
connectionConfig.setSendPresence(false);
ASmackMainActivity.connection = new XMPPConnection(connectionConfig);

2、接收完离线数据后,要将离线数据清除:

offlineManager.deleteMessages();

3、最后要将用户状态设置为在线。

 

ConnectionConfiguration connectionConfig = new ConnectionConfiguration(192.168.1.82, 5222, "");
connectionConfig.setSendPresence(false);
ASmackMainActivity.connection = new XMPPConnection(connectionConfig);

connection.login(用户名,密码);

 

OfflineMessageManager offlineManager = new OfflineMessageManager(ASmackMainActivity.connection);
        Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager.getMessages();
            while(it.hasNext()){
                org.jivesoftware.smack.packet.Message message = it.next();
                Log.e(TAG, "收到离线消息, Received from 【" + message.getFrom() + "】 message: " + message.getBody());
            }
            //删除离线消息
            offlineManager.deleteMessages();
            //将状态设置成在线
            Presence presence = new Presence(Presence.Type.available);
            ASmackMainActivity.connection.sendPacket(presence);

 

 

 同时服务器还要修改下脱机消息的配置,不然会收到重复的离线消息,因为openfire默认是自动保存离线消息的。

 

以上是关于openfire在网络不好或掉线时消息丢失的处理方法的主要内容,如果未能解决你的问题,请参考以下文章

当我在 android 应用程序的另一个活动中时,Openfire 丢失消息

OpenFire 或 XMPP 协议是不是支持消息通知(待处理、已交付、已读取),如 BBM(Blackberry Messenger)

ofFice 对话日志仅保留群聊节的正文

Cisco 1131AP掉线问题处理

获取 openfire 消息需要哪一个 MAM XEP-0313 或 XEP-0136

路由器刚连接网络时一切正常, 但是运行一-段时间之后, 网速就开始下降,甚至频频掉线,怎么弄