Spring JMS

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

Добавить комментарий