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); Mapmap = 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(Messageorder) { ... }
Чтобы добавить несколько слушателей к одному методу, нам просто нужно добавить несколько @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 .