1 Reply Latest reply on Sep 16, 2009 7:53 AM by Guenther Niess

    Poor reconnection behavior

    gperrot Bronze

      Hi everyone,

      I noticed that a whack component is unable to react when the hosting server brutally closes the socket (ejabberd does not send </stream> when it restarts).

      We have to wait to send a packet or to perform a keep alive to detect the disconnection and reconnect.

      After some investigation I found that the cause is an EOFException poorly catched:

          /**
           * A dedicated thread loop for reading the stream and sending incoming
           * packets to the appropriate router.
           */
          public void run() {
              try {
                  readStream();
              }
              catch (EOFException eof) {
                  // Normal disconnect
              }
              catch (SocketException se) {
                  // Do nothing if the exception occured while shutting down the component otherwise
                  // log the error and try to establish a new connection
                  if (!shutdown) {
                      component.getManager().getLog().error(se);
                      component.connectionLost();
                  }
              }
              catch (XmlPullParserException ie) {
                  component.getManager().getLog().error(ie);
              }
              catch (Exception e) {
                  component.getManager().getLog().warn(e);
              }
          }
      

      In that case, the EOFException must be treated exactly like a SocketException.

      In fact, any fatal exception should make trigger the connection error (if the component is not shutting down).

      I suggest keeping only the catch will all exception like in the Smack library:

         /**
           * A dedicated thread loop for reading the stream and sending incoming
           * packets to the appropriate router.
           */
          public void run() {
              try {
                  readStream();
              }
              catch (Exception e) {
                  // Do nothing if the exception occured while shutting down the component otherwise
                  // log the error and try to establish a new connection
                  if (!shutdown) {
                      component.getManager().getLog().error(se);
                      component.connectionLost();
                  }
              }
          }

      Patch attached.