1. Обзор
Spring предоставляет интегрированную среду JMS, которая упрощает использование JMS API. В этой статье представлены основные понятия такой интеграции.
2. Maven Dependency
Чтобы использовать Spring JMS в нашем приложении, нам нужно добавить необходимые артефакты в pom.xml :
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
Самая новая версия артефакта может быть found Вот .
3. JmsTemplate
Класс JmsTemplate обрабатывает создание и освобождение ресурсов при отправке или синхронном получении сообщений.
Следовательно, классу, который использует этот JmsTemplate , нужно только реализовать интерфейсы обратного вызова, как указано в определении метода.
Начиная с Spring 4.1, JmsMessagingTemplate построен поверх JmsTemplate , который обеспечивает интеграцию с абстракцией обмена сообщениями, то есть org.springframework.messaging.Message , которая, в свою очередь, позволяет нам создавать сообщения для отправки в общем виде.
4. Управление подключением
Чтобы подключиться и иметь возможность отправлять/получать сообщения, нам необходимо настроить ConnectionFactory .
ConnectionFactory — это один из администрируемых объектов JMS, которые предварительно настроены администратором. Клиент с помощью конфигурации установит соединение с JMS-провайдером.
Spring предоставляет 2 типа ConnectionFactory :
- SingleConnectionFactory – является реализацией
ConnectionFactory интерфейс, который будет возвращать то же соединение на все вызовы createConnection () и игнорирование вызовов close () ** CachingConnectionFactory — расширяет функциональность
SingleConnectionFactory и добавления улучшают его с помощью кэширования Sessions , MessageProducers и MessageConsumers
5. Управление пунктами назначения
Как обсуждалось выше, наряду с ConnectionFactory , пункты назначения также являются объектами, управляемыми JMS, и могут храниться и извлекаться из JNDI.
Spring предоставляет общие распознаватели, такие как DynamicDestinationResolver , и специальные распознаватели, такие как JndiDestinationResolver .
JmsTemplate делегирует разрешение имени получателя одной из реализаций на основе нашего выбора.
Он также предоставит свойство с именем defaultDestination , которое будет использоваться с операциями send и receive , которые не относятся к определенному месту назначения.
6. Преобразование сообщений
Spring JMS был бы неполным без поддержки конвертеров сообщений.
Стратегия преобразования по умолчанию, используемая JmsTemplate для обеих операций ConvertAndSend () и ReceiveAndConvert () , — это класс SimpleMessageConverter .
The SimpleMessageConverter может обрабатывать TextMessages , BytesMessages , MapMessages и ObjectMessages . Этот класс реализует интерфейс MessageConverter .
Помимо SimpleMessageConverter , Spring JMS предоставляет несколько других классов MessageConverter из коробки, таких как MappingJackson2MessageConverter , MarshallingMessageConverter , MessagingMessageConverter .
Более того, мы можем создавать пользовательские функции преобразования сообщений, просто реализуя методы toMessage () и FromMessage () интерфейса MessageConverter .
Давайте посмотрим пример кода для реализации пользовательского MessageConverter ,
public class SampleMessageConverter implements MessageConverter {
public Object fromMessage(Message message)
throws JMSException, MessageConversionException {
//...
}
public Message toMessage(Object object, Session session)
throws JMSException, MessageConversionException {
//...
}
}
7. Образец Spring JMS
В этом разделе мы увидим, как JmsTemplate используется для отправки и получения сообщений.
По умолчанию для отправки сообщения используется метод JmsTemplate.send () . У него есть два ключевых параметра, первый из которых является адресатом JMS, а второй параметр является реализацией MessageCreator , которая содержит метод обратного вызова createMessage () , который JmsTemplate будет использовать для создания сообщения, которое будет отправлено.
JmsTemplate.send () подходит для отправки простых текстовых сообщений, но для отправки пользовательских сообщений в JmsTemplate есть другой метод, называемый c _onvertAndSend () _ .
Ниже мы можем увидеть реализацию этих методов:
public class SampleJmsMessageSender {
private JmsTemplate jmsTemplate;
private Queue queue;
//setters for jmsTemplate & queue
public void simpleSend() {
jmsTemplate.send(queue, s -> s.createTextMessage("hello queue world"));
}
public void sendMessage(Employee employee) {
System.out.println("Jms Message Sender : " + employee);
Map<String, Object> map = new HashMap<>();
map.put("name", employee.getName()); map.put("age", employee.getAge());
jmsTemplate.convertAndSend(map);
}
}
Ниже приведен класс получателя сообщений, мы называем его POJO, управляемым сообщениями (MDP). Мы можем видеть, что класс SampleListener реализует интерфейс MessageListener и предоставляет конкретную текстовую реализацию для метода интерфейса onMessage () .
Помимо метода onMessage () наш класс SampleListener также вызвал метод receiveAndConvert () для получения пользовательских сообщений:
public class SampleListener implements MessageListener {
public JmsTemplate getJmsTemplate() {
return getJmsTemplate();
}
public void onMessage(Message message) {
if (message instanceof TextMessage) {
try {
String msg = ((TextMessage) message).getText();
System.out.println("Message has been consumed : " + msg);
} catch (JMSException ex) {
throw new RuntimeException(ex);
}
} else {
throw new IllegalArgumentException("Message Error");
}
}
public Employee receiveMessage() throws JMSException {
Map map = (Map) getJmsTemplate().receiveAndConvert();
return new Employee((String) map.get("name"), (Integer) map.get("age"));
}
}
Мы увидели, как реализовать MessageListener , и ниже мы видим конфигурацию в контексте приложения Spring:
<bean id="messageListener" class="com.baeldung.spring.jms.SampleListener"/>
<bean id="jmsContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destinationName" ref="IN__QUEUE"/>
<property name="messageListener" ref="messageListener"/>
</bean>
DefaultMessageListenerContainer является контейнером прослушивателя сообщений по умолчанию, который Spring предоставляет вместе со многими другими специализированными контейнерами.
8. Конфигурация с аннотациями
@ JmsListener — единственная аннотация, необходимая для преобразования метода обычного компонента в конечную точку слушателя JMS. Spring JMS предоставляет гораздо больше аннотаций для упрощения реализации JMS. Мы можем увидеть некоторые из примеров классов, аннотированных классов ниже,
@JmsListener(destination = "myDestination")
public void SampleJmsListenerMethod(Message<Order> order) { ... }
Чтобы добавить несколько слушателей в один метод, нам просто нужно добавить несколько @ JmsListener аннотаций.
@ EnableJms — это аннотация, добавленная к одному из наших классов конфигурации для поддержки описанных выше аннотированных методов @ JmsListener .
@Configuration
@EnableJms
public class AppConfig {
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory
= new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
return factory;
}
}
9. Заключение
В этом руководстве мы обсудили конфигурацию и основные понятия Spring JMS. Мы также кратко рассмотрели специфичные для Spring JmsTemplate классы, которые используются для отправки и получения сообщений.
Original : https://www.codeflow.site/ru/article/spring-jms#Connection