2016-04-26 99 views
0

我有ejabberd作为我的本地服务器和smack作为android侧api。处理异步消息在ejabberd

当用户上线并且有很多离线消息要发送时,ejabberd服务器只是给我发送了消息。我收到了每条消息,但订单并不完美。 邮件发送和保存在服务器中的顺序并不是我如何收到邮件。

我可以通过OfflineMessageManager类处理脱机消息。但是这在ejabberd中不受支持。我用supportsFlexibleRetrieval()来检查它,它返回false。

我也检查了它与Xabber Android应用程序,令人惊讶的是,在这里我从ejabberd服务器以正确的顺序得到所有的消息。所以问题出在我的Android客户端。我的接收器如下 -

PacketListener myListener; 
String new_msg_body, new_msg_from; 

final StanzaFilter filter = new AndFilter(new StanzaTypeFilter(Message.class)); 

     PacketCollector myCollector = conn1.createPacketCollector(filter); 

     myListener = new PacketListener() { 
      @Override 
      public void processPacket(Stanza packet) throws SmackException.NotConnectedException { 
       Message msg = (Message) packet; 
       new_msg_body = msg.getBody(); 
       new_msg_from = msg.getFrom(); 
       Log.i("log", "message recived :" + new_msg_body + " from : " + new_msg_from +" msg id : " + msg.getStanzaId()); 
      } 
     }; 

     conn1.addPacketListener(myListener, filter); 

做任何人有任何建议,这个问题。

进展

到现在我已经发现,每封邮件都有id和每个消息的ID是为了如果他们的发送时间。所以我可以在这里做一个排序来获得消息的顺序。

知道每个发出它自己的接收器实例的数据包。这将使设备一次充满大量消息。这可能会导致问题。

回答

1

ejabberd 16.02或最新版本支持灵活的离线消息检索(XEP-0013)。下载并安装最新版本的ejabberd。 check this link

+0

嘿。感谢您的回复。你能告诉我如何获得我正在使用的ejabberd服务器的当前版本吗? –

+0

您可以使用sudo ejabberdctl状态输出获取版本---- 节点'[email protected]'以状态启动:启动 ejabberd 16.02正在该节点中运行 –

+1

sudo ejabberdctl状态(如果从源安装则工作)否则像我这样使用sudo /opt/ejabberd-16.02/bin/ejabberdctl状态 –

0

XEP-0013:灵活的离线消息检索是从2003年开始的,也许是时候转移到更现代的XEP-0313: Message Archive Management了?对于多个设备环境来说,这是好得多的,例如移动和网络应用程序的并发使用。

MongooseIMMAM有很强的支持:MongooseIM 1.6.2支持MAM v0.2,但我们的主分支(下一版本)支持MAM v0.5.1。您可以将您的消息存档存储在MySQL,PostgreSQL,Riak KV和Cassandra中!

+0

XEP-0013和XEP-0313解决了不同的问题。提问者问题由XEP-0013解决,而不是由XEP-0313解决。 – Flow