Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Знакомство с JMS 2.0

Anna | 5.06.2014 | нет комментариев

Не так давным-давно, 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 заменяет Connection и Session в классиеском JMS API
  • JMSProducer — это легковесная замена MessageProducer-у, которая разрешает задавать настройки доставки сообщений, заголовки, свойства, через вызов цепочки способов (паттерн Строитель)
  • JMSConsumer заменяет MessageConsumer и применяется по такому же тезису

 

Отправка JMS

Для сопоставления. 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)
   }
}

JMS 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 довольно легко передать в способ send строку

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

Синхронное приобретение 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;
}

JMS 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 приложениях, как и раньше, нужно применять message-driven bean, взамен способа setMessageListener

Вставка объекта JMSContext в Java EE приложении

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

Дальнейший фрагмент кода разрешает вставлять JMSContext в session bean либо сервлет.


@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 закроется механически позже коммита, если без транзакции, то закроется в конце запроса.

На этом я решил остановиться. Для ознакомления и начала работы этой информации должно быть довольно. Много детаей и дополнительной информации здесь:
What’s New in JMS 2.0, Part One: Ease of Use
What’s New in JMS 2.0, Part Two—New Messaging Features

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB