Рубрики
Без рубрики

Начало работы с Spring JMS

Краткое введение в Spring JMS и его основные концепции.

Автор оригинала: baeldung.

1. Обзор

Spring предоставляет платформу интеграции JMS, которая упрощает использование API JMS. В данной статье представлены основные понятия такой интеграции.

2. Зависимость Maven

Чтобы использовать Spring JMS в нашем приложении, нам нужно добавить необходимые артефакты в pom.xml :


    org.springframework
    spring-jms
    4.3.3.RELEASE

Новейшую версию артефакта можно найти здесь .

3. JmsTemplate

JmsTemplate класс обрабатывает создание и высвобождение ресурсов при отправке или синхронном получении сообщений.

Следовательно, класс, который использует этот JmsTemplate , должен только реализовать интерфейсы обратного вызова, как указано в определении метода.

Начиная с Spring 4.1, JmsMessagingTemplate построен поверх JmsTemplate , который обеспечивает интеграцию с абстракцией обмена сообщениями, т. Е. org.springframework.messaging.Сообщение. Это, в свою очередь, позволяет нам создать сообщение для отправки в общем виде.

4. Управление подключением

Чтобы подключиться и иметь возможность отправлять/получать сообщения, нам нужно настроить ConnectionFactory .

A ConnectionFactory является одним из администрируемых объектов JMS, которые предварительно настроены администратором . Клиент с помощью конфигурации установит соединение с поставщиком JMS.

Spring предоставляет 2 типа ConnectionFactory :

  • SingleConnectionFactory – является реализацией интерфейса ConnectionFactory , который возвращает одно и то же соединение для всех вызовов createConnection () и игнорирует вызовы close ()
  • CachingConnectionFactory расширяет функциональность SingleConnectionFactory и добавляет к ней кэширование Сеансов , MessageProducers и MessageConsumers

5. Управление Назначением

Как обсуждалось выше, наряду с ConnectionFactory , назначения также являются объектами администрирования JMS и могут храниться и извлекаться из JNDI.

Spring предоставляет общие решатели, такие как DynamicDestinationResolver , и специальные решатели, такие как JndiDestinationResolver .

JmsTemplate делегирует разрешение имени назначения одной из реализаций на основе нашего выбора.

Он также предоставит свойство defaultDestination –, которое будет использоваться с операциями send и receive , которые не относятся к конкретному назначению.

6. Преобразование сообщений

Spring JMS была бы неполной без поддержки преобразователей сообщений.

Стратегия преобразования по умолчанию, используемая JmsTemplate для операций Convert И Send() и ReceiveAndConvert () , – это класс SimpleMessageConverter|/.

SimpleMessageConverter способен справиться Текстовые сообщения , Байты Сообщений , Сообщения карты , и Сообщения об объектах . Этот класс реализует Преобразователь сообщений интерфейс.

Помимо SimpleMessageConverter , Spring JMS предоставляет некоторые другие Преобразователи сообщений классы из коробки, такие как MappingJackson2MessageConverter , MarshallingMessageConverter , MessagingMessageConverter .

Кроме того, мы можем создать пользовательские функции преобразования сообщений, просто реализовав методы Message Converter интерфейса toMessage() и FromMessage () .

Давайте посмотрим пример фрагмента кода по реализации пользовательского Конвертера сообщений ,

public class SampleMessageConverter implements MessageConverter {
    public Object fromMessage(Message message) 
      throws JMSException, MessageConversionException {
        //...
    }

    public Message toMessage(Object object, Session session)
      throws JMSException, MessageConversionException { 
        //...
    }
}

7. Образец пружины JMS

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

По умолчанию для отправки сообщения используется метод JmsTemplate.send() . Он имеет два ключевых параметра, первый из которых является назначением JMS, а второй – реализацией MessageCreator. JmsTemplate использует метод обратного вызова создателя сообщения createMessage() для построения сообщения.

JmsTemplate.отправить() хорош для отправки простых текстовых сообщений, но для отправки пользовательских сообщений, JmsTemplate имеет другой метод, называемый c convertandsend() .

Ниже мы можем увидеть реализацию этих методов:

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 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:

 

 
     
     
     

DefaultMessageListenerContainer является контейнером прослушивателя сообщений по умолчанию, который Spring предоставляет наряду со многими другими специализированными контейнерами.

8. Базовая Конфигурация С Аннотациями Java

@JmsListener – это единственная аннотация, необходимая для преобразования метода обычного компонента в конечную точку прослушивателя JMS. Spring JMS предоставляет гораздо больше аннотаций для облегчения реализации JMS.

Мы можем увидеть некоторые из примеров классов, аннотированных ниже:

@JmsListener(destination = "myDestination")
public void SampleJmsListenerMethod(Message order) { ... }

Чтобы добавить несколько слушателей к одному методу, нам просто нужно добавить несколько @JmsListener аннотаций.

Нам нужно добавить @EnableJms аннотация к одному из наших классов конфигурации для поддержки @JmsListener аннотированные методы:

@Configuration
@EnableJms
public class AppConfig {

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
        DefaultJmsListenerContainerFactory factory 
          = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        return factory;
    }
}

9. Обработчик ошибок

Мы также можем настроить пользовательский обработчик ошибок для нашего контейнера прослушивателя сообщений.

Давайте сначала реализуем org.springframework.util.ErrorHandler интерфейс:

@Service
public class SampleJmsErrorHandler implements ErrorHandler {

    // ... logger

    @Override
    public void handleError(Throwable t) {
        LOG.warn("In default jms error handler...");
        LOG.error("Error Message : {}", t.getMessage());
    }

}

Обратите внимание, что мы переопределили метод HandleError () , который просто регистрирует сообщение об ошибке.

А затем нам нужно сослаться на вашу службу обработчика ошибок в Фабрике соединений прослушивателя Jms по умолчанию с помощью метода setErrorHandler() :

@Bean
public DefaultJmsListenerContainerFactorybjmsListenerContainerFactory() {
    DefaultJmsListenerContainerFactory factory 
      = new DefaultJmsListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory());
    factory.setErrorHandler(sampleJmsErrorHandler);
    return factory;
}

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

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




    
    
    
    

10. Заключение

В этом уроке мы обсудили конфигурацию и основные концепции Spring JMS. Мы также кратко рассмотрели классы Spring-specific JmsTemplate , которые используются для отправки и получения сообщений.

Вы можете найти реализацию кода в проекте GitHub .