/**
   * @param desc Sender process descriptor.
   * @param msg Communication message.
   */
  protected void notifyListener(HadoopProcessDescriptor desc, HadoopMessage msg) {
    HadoopMessageListener lsnr = this.lsnr;

    if (lsnr != null)
      // Notify listener of a new message.
      lsnr.onMessageReceived(desc, msg);
    else if (log.isDebugEnabled())
      log.debug(
          "Received communication message without any registered listeners (will ignore) "
              + "[senderProcDesc="
              + desc
              + ", msg="
              + msg
              + ']');
  }
        /** {@inheritDoc} */
        @Override
        public void onDisconnected(GridNioSession ses, @Nullable Exception e) {
          if (log.isDebugEnabled()) log.debug("Closed connection for session: " + ses);

          if (e != null) U.error(log, "Session disconnected due to exception: " + ses, e);

          HadoopProcessDescriptor desc = ses.meta(PROCESS_META);

          if (desc != null) {
            HadoopCommunicationClient rmv = clients.remove(desc.processId());

            if (rmv != null) rmv.forceClose();
          }

          HadoopMessageListener lsnr0 = lsnr;

          if (lsnr0 != null)
            // Notify listener about connection close.
            lsnr0.onConnectionLost(desc);
        }