public RexProMessage sendRequest(
      RexProMessage request, int maxRetries, int waitMsBetweenTries, int timeoutSeconds) {
    int tries = 0;
    RexProMessage rcvMessage = null;

    // set the session for all incoming messages.
    request.setSessionAsUUID(this.getSessionKey());

    while (rcvMessage == null && tries < maxRetries) {
      tries++;

      try {
        rcvMessage = rexProConnection.sendMessage(request, timeoutSeconds);
      } catch (Exception ex) {
        String logMessage =
            "Failure sending message via RexPro. Attempt [" + tries + "] of [" + maxRetries + "].";

        if (tries < maxRetries) {
          logMessage = logMessage + " Trying again in " + waitMsBetweenTries + " (ms)";
        }

        logger.error(logMessage);

        rcvMessage = null;

        // wait
        try {
          Thread.sleep(waitMsBetweenTries);
        } catch (InterruptedException ie) {
          // carry on
        }
      }
    }

    return rcvMessage;
  }