2017-12-17 26 views
1

오프라인 메시지가 작동하지 않는 openfire, smack 및 android와 채팅 응용 프로그램을 사용하고 있습니다. 두 사용자가 모두 온라인 상태이면 메시지를 올바르게 보내고받을 수 있습니다. 그러나 사용자 A가 오프라인이고 사용자 B가 메시지를 보내는 경우 사용자 A는 온라인 상태가되면 B의 보낸 메시지를받지 못합니다. 가능한 해결책은 stackoverflow에서 가능하지만 작동하지는 않습니다. 아래 코드를 사용하여 오프라인 메시지를 검색하십시오.메아리로 오프라인 메시지가 나타나지 않습니다.

새로운 Thread() { 공공 무효 실행() {

  XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() 

        .setSocketFactory(SocketFactory.getDefault()) 

        .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled) 

        .setServiceName("123.456.0.854")//service name 

        .setHost("123.456.0.854") // host name 

        .setPort(5222) //port 

        .setUsernameAndPassword("phone", "admin") 
        .setConnectTimeout(40000) 

        .setCompressionEnabled(false).build(); 

      connection = new XMPPTCPConnection(config); 

      try { 
       connection.connect(); 
       connection.login("phone", "admin"); 
       Presence presence = new Presence(Presence.Type.available); 
       presence.setStatus("Available"); 
       try { 
        connection.sendStanza(presence); 
       } catch (SmackException.NotConnectedException e) { 
        e.printStackTrace(); 
       } 
      } catch (SmackException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (XMPPException e) { 
       e.printStackTrace(); 
      } 



      OfflineMessageManager offlineMessageManager = new OfflineMessageManager(connection); 

      try { 
       System.out.println("Count is " +offlineMessageManager.getMessageCount()); 
      } catch (SmackException.NoResponseException e) { 
       e.printStackTrace(); 
      } catch (XMPPException.XMPPErrorException e) { 
       e.printStackTrace(); 
      } catch (SmackException.NotConnectedException e) { 
       e.printStackTrace(); 
      } 

     } 
    }.start(); 

답변

0

은 많은 투쟁 후, 나는이 문제를 해결했다. 오픈 파이어 관리자 페이지에서 "클라이언트 설정"으로 이동하여 유휴 시간을 360 초 (기본값)에서 1 초로 줄입니다. 그런 다음 인터넷 연결이 끊어지면 오프라인 상태임을 감지하고 나머지 메시지는 오프라인으로 보존 할 수 있습니다.

@Override 공개 무효가 (부울는, isConnected를) {onNetworkConnectionChanged

if(isConnected){ 
    new Thread() { 

     public void run() { 
      try { 
       XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder(); 
       builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
       builder.setUsernameAndPassword("phone", "admin"); 
       builder.setSendPresence(true); 
       builder.setServiceName(<Service name>); 
       builder.setHost(<Host name>); 
       builder.setResource("Test"); 
       builder.setDebuggerEnabled(true); 
       Presence presence = new Presence(Presence.Type.available); 
       presence.setStatus("Available"); 
       connection = new XMPPTCPConnection(builder.build()); 
       connection.connect(); 
       connection.login(); 
       Presence presence123 = new Presence(Presence.Type.available); 
       presence123.setStatus("Available"); 
       try { 
        connection.sendStanza(presence123); 
       } catch (SmackException.NotConnectedException e) { 
        e.printStackTrace(); 
       } 
       StanzaFilter filter = new AndFilter(new StanzaTypeFilter(Message.class)); 
       PacketListener myListener = new PacketListener() 
       { 
        public void processPacket(Stanza stanza) 
        { 
         retrieveMessage(stanza,userType); 
        } 
       }; 
       connection.addPacketListener(myListener, filter); 
       try { 
        connection.sendStanza(presence); 
       } catch (SmackException.NotConnectedException e) { 
        e.printStackTrace(); 
       } 

      } catch (SmackException | XMPPException | IOException e) { 
       e.printStackTrace(); 
      } 


      //return connection.isConnected(); 
     } 

    }.start(); 

위의 벌금과 오프라인 메시지를 검색 할 수 노력하고 있습니다. 메소드 "retrieveMessage (스탠자, 사용자 유형);" 들어오는 메시지를 처리하고 어댑터를 갱신하는 데 사용됩니다. 다시 연결할 때 현재 상태를 "사용 가능"으로 보내야합니다. 여전히 문제가있는 경우 알려 주시기 바랍니다.