private void sendTotalOrderAnycastMessage(List<Address> destinations, Message message) {
        boolean trace = log.isTraceEnabled();

        long startTime = statsCollector.now();
        long duration = -1;

        final boolean deliverToMySelf = destinations.contains(localAddress);

        if (destinations.size() == 1) {
            MessageID messageID = generateId();
            message.putHeader(id, ToaHeader.createSingleDestinationHeader(messageID));
            message.setDest(destinations.get(0));

            if (trace) {
                log.trace("Sending total order anycast message %s (%s) to single destination", message, message.getHeader(id));
            }

            if (deliverToMySelf) {
                deliverManager.deliverSingleDestinationMessage(message, messageID);
            } else {
                down_prot.down(message);
            }
            return;
        }

        try {
            final MessageID messageID = generateId();
            long sequenceNumber = -1;
            ToaHeader header = ToaHeader.newDataMessageHeader(messageID, destinations);
            message.putHeader(this.id, header);

            if (deliverToMySelf) {
                sequenceNumber = deliverManager.addLocalMessageToDeliver(messageID, message, header);
            }

            if (trace) {
                log.trace("Sending total order anycast message %s (%s) to %s", message, message.getHeader(id), destinations);
            }

            senderManager.addNewMessageToSend(messageID, destinations, sequenceNumber, deliverToMySelf);
            send(destinations, message, false);
            duration = statsCollector.now() - startTime;
        } catch (Exception e) {
            logException("Exception caught while sending anycast message. Error is " + e.getLocalizedMessage(),
                    e);
        } finally {
            statsCollector.addAnycastSentDuration(duration, (destinations.size() - (deliverToMySelf ? 1 : 0)));
        }
    }