docs: void dropConnection(SibRaMessagingEngineConnection connection, boolean isSessionError, boolean retryImmediately, boolean alreadyClosed)
      {
          String methodName = "dropConnection";
          if (TraceComponent.isAnyTracingEnabled() && TRACE.isEntryEnabled())
          {
              SibTr.entry(this, TRACE, methodName,
                          new Object[] { connection, Boolean.valueOf(isSessionError), Boolean.valueOf(retryImmediately), Boolean.valueOf(alreadyClosed) });
          }
  
          SibRaMessagingEngineConnection connectionCheck = null;
          String meUuid = connection.getConnection().getMeUuid();
  
          synchronized (_connections)
          {
              /*
               * Does the connection that we've been passed, still exist?
               */
              connectionCheck = _connections.get(meUuid);
  
              /*
               * If the connection object that we've been passed is the same object as that retrieved from _connections, close it.
               */
              if (connection == connectionCheck)
              {
                  closeConnection(meUuid, alreadyClosed);
              }
          }
  
          // If we are reloading the engine then don't try and reconnect now. Wait until we get an engine 
          // reloaded shoulder tap. Since we don't know if remote MEs are having an engine reloaded we will fail 
          // the connection and deactivate the MDB. The connection is only passed in as a parameter from session
          // error method call.
          if (!isSessionError ||
              (!SibRaEngineComponent.isMessagingEngineReloading(meUuid)))
          {
              // PM49608 The lock hierarchy is first _timerLock and then _connections
              // This hierarchy is necessary to avoid deadlock
              synchronized (_timerLock)
              {
                  synchronized (_connections)
                  {
                      // If this was our last (or only) connection then kick off another loop to check if
                      // we can obtain a new connection.
                      if (_connections.size() == 0)
                      {
                          try
                          {
                              clearTimer();
                              if (retryImmediately)
                              {
                                  timerLoop();
                              }
                              else
                              {
                                  kickOffTimer();
                              }
                          } catch (final ResourceException resEx)
                          {
                              FFDCFilter.processException(resEx, CLASS_NAME + "."
                                                                 + methodName, "1:1434:1.45", this);
  
                              SibTr.error(TRACE, "CONNECT_FAILED_CWSIV0783", new Object[] {
                                                                                           _endpointConfiguration.getDestination()
                                                                                                           .getDestinationName(),
                                                                                           _endpointConfiguration.getBusName(), this, resEx });
                          }
                      }
                  }
              }
          }
          else
          {
              // Stop any timers as no point in trying again until we have finished reloading the engine.
              clearTimer();
          }
  
          if (TraceComponent.isAnyTracingEnabled() && TRACE.isEntryEnabled())
          {
              SibTr.exit(this, TRACE, methodName);
          }
      }