Представляем Jms 2.0

Не так давно, 12 июня 2013 года, мир Представлен релиз Java EE 7 .

Одним из ключевых моментов этого релиза стало появление JMS версии 2.0, которая не обновлялась с 2002 года.

Этот текст представляет собой вольный перевод начала статьи Найджел Дикин .

Целью текста является ознакомление заинтересованного читателя с новым API. API JMS 1.1 требует для работы большого количества кода, но он хорошо зарекомендовал себя, а потому не менялся с 2002 года.

В JMS 2.0 создан новый API, упрощающий отправку и получение сообщений JMS. Старый API не устарел и продолжает работать вместе с новым.

API JMS 2.0 представляет новые интерфейсы: JMSContext, JMSProducer и JMSConsumer.

  • JMSContext заменяет соединение и сеанс в классическом API JMS.
  • JMSProducer — это облегченная замена MessageProducer, которая позволяет задавать параметры доставки сообщений, заголовки, свойства путем вызова цепочки методов ( Шаблон строителя )
  • JMSConsumer заменяет MessageConsumer и используется таким же образом.



Отправка JMS
Для сравнения.

СМС 1.1:

  
  
  
  
  
  
   

public void sendMessageJMS11(ConnectionFactory connectionFactory, Queue queue, String text) { try { Connection connection = connectionFactory.createConnection(); try { Session session =connection.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageProducer messageProducer = session.createProducer(queue); TextMessage textMessage = session.createTextMessage(text); messageProducer.send(textMessage); } finally { connection.close(); } } catch (JMSException ex) { // handle exception (details omitted) } }

ЖМС 2.0:

public void sendMessageJMS20(ConnectionFactory connectionFactory, Queue queue, String text) { try (JMSContext context = connectionFactory.createContext();){ context.createProducer().

send(queue, text); } catch (JMSRuntimeException ex) { // handle exception (details omitted) } }

  • В версии 2.0 мы используем try-with-resources из JavaSE 7.
  • Параметр Session.AUTO_ACKNOWLEDGE установлен по умолчанию в JMSContext. Если требуется другое значение (CLIENT_ACKNOWLEDGE или DUPS_OK_ACKNOWLEDGE), оно передается как отдельный параметр.

  • Использует JMSContext вместо объектов Connection и Session.
  • Чтобы создать TextMessage, просто передайте строку методу отправки.

Отличительной особенностью нового API является то, что его методы выбрасывают RuntimeException — JMSRuntimeException вместо проверяемого исключения JMSException. Это позволяет при желании не обрабатывать исключения JMS.

Синхронное получение JMS
Давайте сравним разницу при синхронном получении сообщений.

СМС 1.1:

public String receiveMessageJMS11(ConnectionFactory connectionFactory,Queue queue){ String body=null; try { Connection connection = connectionFactory.createConnection(); try { Session session =connection.createSession(false,Session.AUTO_ACKNOWLEDGE); MessageConsumer messageConsumer = session.createConsumer(queue); connection.start(); TextMessage textMessage = (TextMessage)messageConsumer.receive(); body = textMessage.getText(); } finally { connection.close(); } } catch (JMSException ex) { // handle exception (details omitted) } return body; }

ЖМС 2.0:

public String receiveMessageJMS20(ConnectionFactory connectionFactory,Queue queue){ String body=null; try (JMSContext context = connectionFactory.createContext();){ JMSConsumer consumer = context.createConsumer(queue); body = consumer.receiveBody(String.class); } catch (JMSRuntimeException ex) { // handle exception (details omitted) } return body; }

  • Использует try-with-resources для автоматического закрытия соединения.

  • Использует JMSContext вместо объектов Connection и Session.
  • AUTO_ACKNOWLEDGE установлен по умолчанию.

  • Обрабатывает JMSRuntimeException, который может быть необработан вместо JMSException в JMS 1.1.
  • Connection.start() выполняется автоматически
  • Строка получается автоматически с помощью метода Consumer.receiveBody(String.class) вместо получения объекта Message, его приведения к TextMessage и вызова метода getText.


Асинхронный поиск JMS
В JavaSE для асинхронного получения сообщений JMS 1.1 использует следующий код:

MessageConsumer messageConsumer = session.createConsumer(queue); messageConsumer.setMessageListener(messageListener); connection.start();

В JMS 2.0 это выглядит так:

JMSConsumer consumer = context.createConsumer(queue); consumer.setMessageListener(messageListener);

Вместо MessageConsumer — JMSConsumer. Соединение начнется автоматически.

В приложениях Java EE Web или EJB, как и раньше, вместо метода setMessageListener необходимо использовать bean-компонент, управляемый сообщениями.



Вставка объекта JMSContext в приложение Java EE
В приложении Java EE JMSContext можно вставить с помощью аннотации.

Вводить .

После вставки JMSContext будет находиться под контролем сервера приложений.

Следующий фрагмент кода позволяет вставить JMSContext в сеансовый компонент или сервлет.

@Inject @JMSConnectionFactory( "jms/connectionFactory") private JMSContext context; @Resource(lookup = "jms/dataQueue") private Queue dataQueue; public void sendMessageJavaEE7(String body) { context.send(dataQueue, body); }

Закрытие JMSContext выполняется автоматически сервером приложений.

Если во время запроса выполняется транзакция JTA, то JMSContext автоматически закроется после фиксации; если без транзакции, она закроется в конце запроса.

Я решил остановиться на этом.

Этой информации должно быть достаточно, чтобы ознакомиться и начать работу.

Подробности и дополнительная информация здесь: Что нового в JMS 2.0, часть первая: простота использования Что нового в JMS 2.0, часть вторая: новые функции обмена сообщениями Теги: #javaee7 #javaee #java #jms2.0 #jms #programming #java

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.