smack connect to xmpp server with previous stream id

I'm building a chat application using xmpp over Ejabbered for server and smack for android client

I've established connecting , login , send and receiving messages ,then I've faced a problem with user network disconnecting and reconnecting , which has been solved by Reconnecting Manger in smack and xmpp-0198, however there is a case where i need to create a new connection in smack but use the previous session (stream) to get all the messages stored in that session (they don't get stored to offline messages) ,and if i create a new connection with new stream id , user messages get lost .

so is there a connection constructor to implement this solution . or server side configuration to store thous messages to offline messages


I think one of the following will solve your issue-

  • First check is mod_offline enabled in the server side.
  • If mod_offline enabled then check offline message limit in the server side. It should be greater than 0.
  • Use PingManager to stable your connection. I am here putting sample code to use PingManager in android-
  • During XMPPTcpConnection initiation-

    pingManager = PingManager.getInstanceFor(this.connection);
    pingManager.registerPingFailedListener(new PingFailedListener() {
        @Override
        public void pingFailed() {
            // session dropped, request for reconnection
        }
    });
    

    When XMPPTcpCOnnection authenticated-

    @Override
    public void authenticated(XMPPConnection connection, boolean resumed) {
        configurePingManager();
    }
    
    private void configurePingManager() {
        pingManager.setPingInterval(ACCORDING_SERVER_PING_INTERVAL);
        pingManager.pingServerIfNecessary();
    }
    
  • Make sure stream_management enabled both in server side and client side. I am here putting a sample code to enable stream_management for android client side-
  • xmppTcpConnection.setUseStreamManagement(true); xmppTcpConnection.setUseStreamManagementResumption(true);

    When XMPPTcpCOnnection authenticated checking session status send and request all pending streams using the code below-

    @Override
    public void authenticated(XMPPConnection connection, boolean resumed) {
        configurePingManager();
        if (!resumed) {
            try {
                xmppTcpConnection.sendSmAcknowledgement();
                xmppTcpConnection.requestSmAcknowledgement();
            } catch (SmackException.NotConnectedException | StreamManagementException.StreamManagementNotEnabledException e) {
                e.printStackTrace();
            } 
        }
    }  
    

    Hope following all those steps your problem will be solved.


    after lots of searching ,finally i upgraded Ejabberd server to the latest version 17.03

    where they've added the new module mod_stream_mgmt ,and changed the behavior of stream management , so when i create a new connection it get rebind to the old one and receive the unsent and un-handled messages

    to activated the mod_stream_mgmt i used the following configurations :

    mod_stream_mgmt : 
      resume_timeout :60
      resend_on_timeout: true
    

    Note : I have also activated mod_ping on server side ,I don't know if that has a direct effect on this process and case but right now my clients are not missing any messages .

    链接地址: http://www.djcxy.com/p/94156.html

    上一篇: 如何使用php代码在ejabbered上注册用户

    下一篇: 用先前的流ID连接到xmpp服务器