/**
   * Creates a {@link org.springframework.jms.core.JmsOperations} object used for one way messaging
   */
  public JmsOperations createInOnlyTemplate(
      JmsEndpoint endpoint, boolean pubSubDomain, String destination) {
    if (jmsOperations != null) {
      return jmsOperations;
    }

    ConnectionFactory factory = getTemplateConnectionFactory();
    JmsTemplate template = new CamelJmsTemplate(this, factory);

    template.setPubSubDomain(pubSubDomain);
    if (destinationResolver != null) {
      template.setDestinationResolver(destinationResolver);
      if (endpoint instanceof DestinationEndpoint) {
        LOG.debug(
            "You are overloading the destinationResolver property on a DestinationEndpoint; are you sure you want to do that?");
      }
    } else if (endpoint instanceof DestinationEndpoint) {
      DestinationEndpoint destinationEndpoint = (DestinationEndpoint) endpoint;
      template.setDestinationResolver(createDestinationResolver(destinationEndpoint));
    }
    template.setDefaultDestinationName(destination);

    template.setExplicitQosEnabled(isExplicitQosEnabled());
    template.setDeliveryPersistent(deliveryPersistent);
    if (messageConverter != null) {
      template.setMessageConverter(messageConverter);
    }
    template.setMessageIdEnabled(messageIdEnabled);
    template.setMessageTimestampEnabled(messageTimestampEnabled);
    if (priority >= 0) {
      template.setPriority(priority);
    }
    template.setPubSubNoLocal(pubSubNoLocal);
    if (receiveTimeout >= 0) {
      template.setReceiveTimeout(receiveTimeout);
    }
    // only set TTL if we have a positive value and it has not been disabled
    if (timeToLive >= 0 && !isDisableTimeToLive()) {
      template.setTimeToLive(timeToLive);
    }

    template.setSessionTransacted(transacted);
    if (transacted) {
      template.setSessionAcknowledgeMode(Session.SESSION_TRANSACTED);
    } else {
      // This is here for completeness, but the template should not get
      // used for receiving messages.
      if (acknowledgementMode >= 0) {
        template.setSessionAcknowledgeMode(acknowledgementMode);
      } else if (acknowledgementModeName != null) {
        template.setSessionAcknowledgeModeName(acknowledgementModeName);
      }
    }
    return template;
  }
  /**
   * Creates a {@link org.springframework.jms.core.JmsOperations} object used for request/response
   * using a request timeout value
   */
  public JmsOperations createInOutTemplate(
      JmsEndpoint endpoint, boolean pubSubDomain, String destination, long requestTimeout) {
    JmsOperations answer = createInOnlyTemplate(endpoint, pubSubDomain, destination);
    if (answer instanceof JmsTemplate && requestTimeout > 0) {
      JmsTemplate jmsTemplate = (JmsTemplate) answer;
      jmsTemplate.setExplicitQosEnabled(true);

      // prefer to use timeToLive over requestTimeout if both specified
      long ttl = timeToLive > 0 ? timeToLive : requestTimeout;
      if (ttl > 0 && !isDisableTimeToLive()) {
        // only use TTL if not disabled
        jmsTemplate.setTimeToLive(ttl);
      }

      jmsTemplate.setSessionTransacted(isTransactedInOut());
      if (isTransactedInOut()) {
        jmsTemplate.setSessionAcknowledgeMode(Session.SESSION_TRANSACTED);
      } else {
        if (acknowledgementMode >= 0) {
          jmsTemplate.setSessionAcknowledgeMode(acknowledgementMode);
        } else if (acknowledgementModeName != null) {
          jmsTemplate.setSessionAcknowledgeModeName(acknowledgementModeName);
        } else {
          // default to AUTO
          jmsTemplate.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
        }
      }
    }
    return answer;
  }