@Override
    public void run() {
      try {
        long now = System.currentTimeMillis();

        synchronized (monitor) {

          // Send due empty acknowledgements
          Iterator<Map.Entry<Long, Collection<IncomingReliableMessageExchange>>>
              dueAcknowledgements =
                  emptyAcknowledgementSchedule.asMap().headMap(now, true).entrySet().iterator();

          while (dueAcknowledgements.hasNext()) {
            Map.Entry<Long, Collection<IncomingReliableMessageExchange>> part =
                dueAcknowledgements.next();

            for (IncomingReliableMessageExchange messageExchange : part.getValue()) {
              if (!messageExchange.isAcknowledgementSent()) {
                InetSocketAddress remoteEndpoint = messageExchange.getRemoteEndpoint();
                int messageID = messageExchange.getMessageID();

                writeEmptyAcknowledgement(remoteEndpoint, messageID);

                messageExchange.setAcknowledgementSent();
              }
            }

            dueAcknowledgements.remove();
          }

          // Retire open NON messages

        }
      } catch (Exception e) {
        log.error("Error in reliability task for incoming message exchanges!", e);
      }
    }