- PVSM.RU - https://www.pvsm.ru -
Не так давно, 12 июня 2013, миру был представлен релиз Java EE 7 [1]. Одним из ключевых моментов в этом релизе было появление JMS версии 2.0, которая не обновлялась с 2002 года.
Данный текст является вольным переводом начала статьи [2] Найджела Дикина [3]. Текст предназначен для ознакомления заинтересованного читателя с новым API.
API JMS 1.1 требует для работы достаточно много кода, но успело себя хорошо зарекомендовать, потому, с 2002 года не изменялось. В JMS 2.0 новое API призвано упростить отправку и прием JMS-сообщений. Прежнее API не упраздняется и продолжает работать наравне с новым.
В API JMS 2.0 появились новые интерфейсы: JMSContext, JMSProducer и JMSConsumer.
Для сравнения. 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)
}
}
Отличительной особенностью нового API является то, что его методы бросают RuntimeException — JMSRuntimeException, вместо checked-исключения 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;
}
JMS 2.0:
public String receiveMessageJMS20(ConnectionFactory connectionFactory,Queue queue){
String body=null;
try (JMSContext context = connectionFactory.createContext();){
JMSConsumer consumer = session.createConsumer(queue);
body = consumer.receiveBody(String.class);
} catch (JMSRuntimeException ex) {
// handle exception (details omitted)
}
return body;
}
В 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
В Java EE приложении JMSContext можно вставить посредством аннотации Inject [5]. После вставки 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 [2]
What's New in JMS 2.0, Part Two—New Messaging Features [6]
Автор: shurik2533
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/37246
Ссылки в тексте:
[1] был представлен релиз Java EE 7: http://www.oracle.com/us/corporate/press/1957557
[2] статьи: http://www.oracle.com/technetwork/articles/java/jms20-1947669.html
[3] Найджела Дикина: https://www.java.net//jcp/communityspotlight/nigel-deakin
[4] паттерн Строитель: http://en.wikipedia.org/wiki/Builder_pattern
[5] Inject: http://habrahabr.ru/users/inject/
[6] What's New in JMS 2.0, Part Two—New Messaging Features: http://www.oracle.com/technetwork/articles/java/jms2messaging-1954190.html
[7] Источник: http://habrahabr.ru/post/184460/
Нажмите здесь для печати.