@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); } }