2015-04-05 2 views
5

Это мой первый раз с Spring JMS (и с JMS в целом), и у меня есть некоторые сомнения, связанные с концепцией обратного вызова JMSTemplate JmsTemplate.Что такое обратный вызов JmsTemplate в Spring JMS?

Я знаю, что JmsTemplate класс при условии, с весны до:

  • Уменьшает шаблонный код.
  • Управление ресурсами прозрачно.
  • Преобразует проверенные исключения в эквиваленты времени выполнения.
  • Предоставляет удобные методы и обратные вызовы.

и что он используется для создания сообщений и синхронного приема сообщений. Это упрощает использование JMS, поскольку оно обрабатывает создание и выпуск ресурсов при отправке или синхронном получении сообщений.

Чтение официальной документации Spring (здесь: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html) я нашел:

код, который использует JmsTemplate нужно только реализовать функцию обратного вызова интерфейсов, давая им четко определенный контракт на высоком уровне. Интерфейс обратного вызова MessageCreator создает сообщение с сеансом , предоставляемым вызывающим кодом в JmsTemplate.

Это неясно для меня. Каковы именно эти обратные вызовы?

В начале я подумал, что обратный вызов - это метод, предоставляемый с помощью JmsTemplate , но чтение здесь кажется чем-то более похожим на интерфейс, который я должен реализовать. Как это работает?

Я также нашел этот пример:

послав POJO Повсеместно JMS (с использованием JmsTemplate):

public class JmsOrderManager implements OrderManager { 
    @Autowired JmsTemplate jmsTemplate; 
    @Autowired Destination orderQueue; 

    public void placeOrder(Order order) { 
     String stringMessage = "New order " + order.getNumber(); 
     jmsTemplate.convertAndSend("messageQueue", stringMessage); 
     // use destination resolver and message converter 
     jmsTemplate.convertAndSend(orderQueue, order); // use message converter 
     jmsTemplate.convertAndSend(order); // use converter and default destination 
    } 
} 

я подумал, что convertAndSend() метод является JmsTemplate обратного вызова но, вероятно, это утверждение неверно.

Можете ли вы объяснить мне, что такое обратный вызов JmsTemplate?

ответ

6

Принцип конструкции, общий для шаблонных классов Spring является предоставлением вспомогательных методов для выполнения общих операций и для более сложного использования, Делегат сути обработки задачи к реализован пользовательским интерфейсам обратного вызова.

В JMS Connection будет получен с завода

=> Из этого сеанса связи создан, seesion является единицей работы, он также обеспечивает транзакции

=> из сеанса создавать различные типы сообщений JMS, такие как TextMessage, ObjectMessage, MapMessage, BytesMessage и StreamMessage следующими способами: session.createTextMessage («мир очереди привет»); session.createObjectMessage (someSerializedObject) и так далее

=> На этой же сессии также отвечает за создание экземпляра из MessageProducer session.createProducer (назначения) и MessageConsumer session.createConsumer (назначения)

Возможны следующие возможности convertAndSend (перегруженные методы):

 jmsTemplate.convertAndSend(message) 
     jmsTemplate.convertAndSend(destination, message) 
     jmsTemplate.convertAndSend(message, postProcessor) 
     jmsTemplate.convertAndSend(destinationName, message) 
     jmsTemplate.convertAndSend(destination, message, postProcessor) 
     jmsTemplate.convertAndSend(destinationName, message, postProcessor) 

Что происходит? Базовое использование обратного вызова, например 3-й и 6-й подписи, вы можете изменить сообщение после преобразования объекта в сообщение JMS через сконфигурированный MessageConverter. Вы видите фактическое место назначения, которое должно быть разрешено DestinationResolver в случае 6-го, вы не передаете его, оно будет разрешено из JNDI, если оно зарегистрировано там.

Что это значит?

jmsTemplate.send(this.queue, new MessageCreator() { 
public Message createMessage(Session session) throws JMSException { 
     return session.createTextMessage("hello queue world"); 
    } 
}); 

Вот в этом примере вы видите с посылом() методом шаблона JMS вы предоставляете анонимную реализацию (обратный вызов), где метод дает вам доступ к к сессии объекту и от этой сессии вы создали индивидуальные сессии .createTextMessage (сообщение «hello queue world»).

Точно так же в convertAndSend (вы можете получить доступ к постпроцессорам для изменения) Объект

public void ConvertSend() { 
Map map = new HashMap(); 
map.put("Name", "Vimal"); 
map.put("Age", new Integer(45)); 
jmsTemplate.convertAndSend("jmsQueue", map, new MessagePostProcessor() { 
    public Message postProcessMessage(Message message) throws JMSException { 
     message.setIntProperty("ID", 9999); 
     message.setJMSCorrelationID("123-99999"); 
     return message; 
     } 
    }); 
} 

Сообщения был создан, но вы его изменения (добавление еще два свойства, в дополнении к имени и возрасту). Интерфейс MessagePostProcessor дает вам доступ к сообщению после его преобразования, но до его отправки.

Другими словами! настройка свойств сообщения, заголовков и тела не может быть инкапсулирована внутри класса преобразователя (SimpleMessageConverter), но интерфейс MessagePostProcessor дает вам доступ к сообщению после его преобразования, но перед отправкой.

3

Это позволяет вам низкоуровневый доступ к JMS лиц (например, к Session в SessionCallback с использованием execute()), в то же время надежно освобождая ресурсы, когда операция будет завершена.

+0

ммм все еще остается чем-то непонятным для меня. Итак, каковы эти обратные вызовы (в дополнение к SessionCallback), поэтому я попытаюсь выполнить поиск в некотором примере – AndreaNobili

+2

Вы можете выполнять операции, например, непосредственно на 'Session' - читать JMS Spec. и Javadocs для получения дополнительной информации. –

Смежные вопросы