代码之家  ›  专栏  ›  技术社区  ›  Tristan

如何自动重新连接到XMPP服务器?

  •  0
  • Tristan  · 技术社区  · 7 年前

    我有一个应用程序,它应该保持与XMPP服务器的永久连接。但每隔2或3天,它就会断开连接,并且不能像预期的那样自动与ReconnectionManager重新连接。

    我能做些什么来了解发生了什么和/或纠正这一点?

    2018-09-20 07:06:10.887 -  WARN - o.j.smack.AbstractXMPPConnection         : Connection closed with error
    java.net.SocketException: Connexion terminée par expiration du délai d'attente (Read failed)
            at java.net.SocketInputStream.socketRead0(Native Method)
            at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
            at java.net.SocketInputStream.read(SocketInputStream.java:171)
            at java.net.SocketInputStream.read(SocketInputStream.java:141)
            at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
            at sun.security.ssl.InputRecord.read(InputRecord.java:503)
            at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
            at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:940)
            at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
            at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
            at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
            at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
            at java.io.InputStreamReader.read(InputStreamReader.java:184)
            at java.io.BufferedReader.fill(BufferedReader.java:161)
            at java.io.BufferedReader.read1(BufferedReader.java:212)
            at java.io.BufferedReader.read(BufferedReader.java:286)
            at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:2992)
            at org.xmlpull.mxp1.MXParser.more(MXParser.java:3046)
            at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144)
            at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093)
            at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1177)
            at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:956)
            at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:971)
            at java.lang.Thread.run(Thread.java:748)
    

    以下是我的连接配置(Spring java风格配置):

      @Bean("xmppConnection")
      public XmppConnectionFactoryBean xmppConnectionFactoryBean() {
    
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setUsernameAndPassword(appProperties.getXmpp().getUsername(), appProperties.getXmpp().getPassword());
        configBuilder.setServiceName(appProperties.getXmpp().getServiceName());
        configBuilder.setHost(appProperties.getXmpp().getHost());
        int port = appProperties.getXmpp().getPort();
        if (port != 0) {
          configBuilder.setPort(port);
        }
        int timeout = appProperties.getXmpp().getTimeout();
        if (timeout != 0) {
          configBuilder.setConnectTimeout(timeout);
        }
        configBuilder.setDebuggerEnabled(appProperties.getXmpp().isDebuggerEnabled());
        XMPPTCPConnectionConfiguration config = configBuilder.build();
    
        XmppConnectionFactoryBean connectionFactoryBean = new XmppConnectionFactoryBean();
        connectionFactoryBean.setConnectionConfiguration(config);
        connectionFactoryBean.setSubscriptionMode(null);
    
        return connectionFactoryBean;
      }
    

    这里是Spring Integration conf中使用连接的地方:

    <int-xmpp:inbound-channel-adapter id="xmppInboundAdapter" channel="xmppInbound" xmpp-connection="xmppConnection" auto-startup="true" />
    

    更新:为了审核这个问题,我刚刚向xmppConnection添加了一个侦听器:

      @Bean("xmppConnection")
      public XMPPConnection xmppConnection(XmppConnectionFactoryBean xmppConnectionFactoryBean) throws Exception {
        XMPPConnection xmppConnection = xmppConnectionFactoryBean.getObject();
        xmppConnection.addConnectionListener(new ConnectionListener() {
    
          @Override
          public void reconnectionSuccessful() {
            logger.info("Successfully reconnected to the XMPP server.");
          }
    
          @Override
          public void reconnectionFailed(Exception arg0) {
            logger.info("Failed to reconnect to the XMPP server.");
          }
    
          @Override
          public void reconnectingIn(int seconds) {
            logger.info("Reconnecting in " + seconds + " seconds.");
          }
    
          @Override
          public void connectionClosedOnError(Exception arg0) {
            logger.error("Connection to XMPP server was lost.");
          }
    
          @Override
          public void connectionClosed() {
            logger.info("XMPP connection was closed.");
          }
    
          @Override
          public void connected(XMPPConnection connection) {
            logger.info("Connected to XMPP server.");        
          }
    
          @Override
          public void authenticated(XMPPConnection connection, boolean resumed) {
            logger.info("Authenticated to XMPP server.");        
          }
        });
    
        return xmppConnection;
    
      }
    

    更新2: 现在,随着审计的启动,我可以看到:

    2018-10-03 07:29:39.442 - ERROR - f.e.r.l.i.xmpp.config.XmppManagerConfig  : Connection to XMPP server was lost.
    

    但绝不要“重新连接”或“未能重新连接”。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Harin Kaklotar    7 年前

    您好,我希望您使用的是smack 4.3.0的最新版本

    默认情况下,Smack将尝试重新连接,以防连接中断 突然断开。重新连接管理器将尝试 立即重新连接到服务器,并增加 连续的重新连接不断失败。

    如果您想在重新连接管理器等待重新连接时强制重新连接 下次重新连接时,您可以使用 AbstractXMPPConnection#connect() 将进行新的尝试。如果手动尝试也失败,则 重新连接管理器仍将继续重新连接作业。