protected void processDispatch(Command command) throws IOException {
   MessageDispatch messageDispatch =
       (MessageDispatch) (command.isMessageDispatch() ? command : null);
   try {
     if (!stopping.get()) {
       if (messageDispatch != null) {
         protocolManager.preProcessDispatch(messageDispatch);
       }
       dispatch(command);
     }
   } catch (IOException e) {
     if (messageDispatch != null) {
       TransmitCallback sub = messageDispatch.getTransmitCallback();
       protocolManager.postProcessDispatch(messageDispatch);
       if (sub != null) {
         sub.onFailure();
       }
       messageDispatch = null;
       throw e;
     }
   } finally {
     if (messageDispatch != null) {
       TransmitCallback sub = messageDispatch.getTransmitCallback();
       protocolManager.postProcessDispatch(messageDispatch);
       if (sub != null) {
         sub.onSuccess();
       }
     }
   }
 }