JmsTemplate содержит множество вспомогательных методов для отправки сообщения. Методы отправки задают место назначения с помощью объекта javax.jms.Destination, а другие методы задают место назначения с помощью String в процедуре поиска через JNDI. Метод send, не принимающий никакого аргумента адреса назначения, использует адрес назначения по умолчанию.

В следующем примере обратный вызов MessageCreator использован для создания текстового сообщения из предоставленного объекта Session:

import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.Session;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.core.JmsTemplate;
public class JmsQueueSender {
    private JmsTemplate jmsTemplate;
    private Queue queue;
    public void setConnectionFactory(ConnectionFactory cf) {
        this.jmsTemplate = new JmsTemplate(cf);
    }
    public void setQueue(Queue queue) {
        this.queue = queue;
    }
    public void simpleSend() {
        this.jmsTemplate.send(this.queue, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage("hello queue world");
            }
        });
    }
}

В предыдущем примере JmsTemplate создается путем передачи ссылки на ConnectionFactory. В качестве альтернативы имеется конструктор с нулевым значением аргумента и connectionFactory, которые можно использовать для создания экземпляра в стиле JavaBean (с помощью BeanFactory или обычного Java-кода). Кроме того, можно использовать базовый класс JmsGatewaySupport из Spring, который предусматривает предварительно созданные свойства бина для JMS-конфигурации.

Метод send(String destinationName, MessageCreator creator) позволяет отправить сообщение, используя строковое имя адреса назначения. Если эти имена зарегистрированы в JNDI, следует установить свойство destinationResolver шаблона для экземпляра JndiDestinationResolver.

Если был создан JmsTemplate и задан адрес назначения по умолчанию, send(MessageCreator c) отправляет сообщение по этому адресу назначения.

Использование преобразователей сообщений

Для облегчения отправки объектов модели предметной области JmsTemplate предусматривает различные методы отправки, которые принимают Java-объект в качестве аргумента для содержимого данных сообщения. Перегруженные методы convertAndSend() и receiveAndConvert() в JmsTemplate делегируют процесс преобразования экземпляру интерфейса MessageConverter. Этот интерфейс определяет простой контракт для преобразования между объектами Java и сообщениями JMS. Реализация по умолчанию (SimpleMessageConverter) поддерживает преобразование между String и TextMessage, byte[] и BytesMessage, а также java.util.Map и MapMessage. Используя преобразователь, вы и код вашего приложения сможете сфокусироваться на бизнес-объекте, который отправляется или принимается через JMS, и не беспокоиться о том, как он представлен в виде JMS-сообщения.

В настоящее время песочница содержит MapMessageConverter, который использует отражение для преобразования между JavaBean и MapMessage. Другими популярными вариантами реализации, которые можно реализовать самостоятельно, являются преобразователи, использующие существующий пакет маршализации XML (например, JAXB или XStream) для создания TextMessage, представляющего объект.

Чтобы настроить свойства, заголовки и тело сообщения, которые нельзя инкапсулировать в класс-преобразователь, интерфейс MessagePostProcessor предоставляет доступ к сообщению после его преобразования, но до отправки. В следующем примере показано, как изменить заголовок сообщения и свойство после преобразования java.util.Map в сообщение:

public void sendWithConversion() {
    Map map = new HashMap();
    map.put("Name", "Mark");
    map.put("Age", new Integer(47));
    jmsTemplate.convertAndSend("testQueue", map, new MessagePostProcessor() {
        public Message postProcessMessage(Message message) throws JMSException {
            message.setIntProperty("AccountID", 1234);
            message.setJMSCorrelationID("123-00001");
            return message;
        }
    });
}

Это приводит к появлению сообщения следующего вида:

MapMessage={
    Header={
        ... standard headers ...
        CorrelationID={123-00001}
    }
    Properties={
        AccountID={Integer:1234}
    }
    Fields={
        Name={String:Mark}
        Age={Integer:47}
    }
}

Использование SessionCallback и ProducerCallback

Хотя операции отправки охватывают многие распространенные сценарии использования, иногда может понадобиться выполнить несколько операций над Session по стандарту JMS или MessageProducer. SessionCallback и ProducerCallback открывают Session по стандарту JMS и пару Session / MessageProducer, соответственно. Методы execute() на JmsTemplate запускают эти методы обратного вызова.