public void send(Collection recipients, boolean multicast)
      throws InterruptedException, ReplyException {
    final boolean isDebugEnabled = logger.isDebugEnabled();

    if (Thread.interrupted()) {
      throw new InterruptedException();
    }
    recipients = new HashSet(recipients);
    DistributedMember me = originDm.getDistributionManagerId();
    recipients.remove(me);
    // this message is only used by battery tests so we can log info level debug
    // messages
    if (isDebugEnabled) {
      logger.debug("Recipients for SerialAckedMessage are {}", recipients);
    }
    rp = new ReplyProcessor21(originDm, recipients);
    processorId = rp.getProcessorId();
    setRecipients(recipients);
    setMulticast(multicast);
    Set failures = originDm.putOutgoing(this);
    if (failures != null && failures.size() > 0) {
      for (final Object failure : failures) {
        InternalDistributedMember mbr = (InternalDistributedMember) failure;
        if (isDebugEnabled) {
          logger.debug("Unable to send serial acked message to {}", mbr);
        }
        // rp.removeMember(mbr, true);
      }
    }

    rp.waitForReplies();
  }
send the message and wait for replies

@param recipients the destination manager ids
@param multicast whether to use multicast or unicast
@throws InterruptedException if the operation is interrupted (as by shutdown)
@throws ReplyException if an exception was sent back by another manager
geode-core/src/main/java/org/apache/geode/distributed/internal/SerialAckedMessage.java