public ConsoleCommunication(Connector connector)
        throws CommunicationException, FileStore.FileStoreException {

      final ClientReceiver receiver =
          ClientReceiver.connect(connector, new AgentAddress(m_agentIdentity));
      m_sender = ClientSender.connect(receiver);
      m_connector = connector;

      if (m_fileStore == null) {
        // Only create the file store if we connected.
        m_fileStore =
            new FileStore(new File("./" + m_agentIdentity.getName() + "-file-store"), m_logger);
      }

      m_sender.send(
          new AgentProcessReportMessage(
              ProcessReport.STATE_STARTED, m_fileStore.getCacheHighWaterMark()));

      final MessageDispatchSender fileStoreMessageDispatcher = new MessageDispatchSender();
      m_fileStore.registerMessageHandlers(fileStoreMessageDispatcher);

      final MessageDispatchSender messageDispatcher = new MessageDispatchSender();
      m_consoleListener.registerMessageHandlers(messageDispatcher);

      // Everything that the file store doesn't handle is tee'd to the
      // worker processes and our message handlers.
      fileStoreMessageDispatcher.addFallback(
          new TeeSender(messageDispatcher, new IgnoreShutdownSender(m_fanOutStreamSender)));

      m_messagePump = new MessagePump(receiver, fileStoreMessageDispatcher, 1);

      m_reportRunningTask =
          new TimerTask() {
            public void run() {
              try {
                m_sender.send(
                    new AgentProcessReportMessage(
                        ProcessReport.STATE_RUNNING, m_fileStore.getCacheHighWaterMark()));
              } catch (CommunicationException e) {
                cancel();
                e.printStackTrace();
              }
            }
          };
    }
    public void shutdown() {
      m_reportRunningTask.cancel();

      try {
        m_sender.send(
            new AgentProcessReportMessage(
                ProcessReport.STATE_FINISHED, m_fileStore.getCacheHighWaterMark()));
      } catch (CommunicationException e) {
        // Ignore - peer has probably shut down.
      } finally {
        m_messagePump.shutdown();
      }
    }