Как автоматически переподключиться к XMPP серверу? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть приложение, которое должно поддерживать постоянное соединение с сервером 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)

Вот мой Conf Connection (Конфигурация 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 Ответ

0 голосов
/ 05 октября 2018

Привет. Надеюсь, вы используете последнюю версию smack 4.3.0

По умолчанию Smack попытается восстановить соединение, если оно было внезапно отключено.Диспетчер переподключения попытается немедленно переподключиться к серверу и увеличит задержку между попытками, поскольку последовательные переподключения продолжают давать сбой.

Если вы хотите форсировать переподключение, пока менеджер переподключения ожидает следующего переподключения, вы можете просто использовать AbstractXMPPConnection#connect(), и будет предпринята новая попытка.Если попытка вручную также не удалась, менеджер переподключения продолжит задание переподключения.

...