Не так давно, 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:
ЖМС 2.0: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) } }
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, просто передайте строку методу отправки.
Синхронное получение 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
-
Динамометр
19 Oct, 24 -
Я Хабраголик. Уход?
19 Oct, 24 -
Выпущен Mps 2021.1
19 Oct, 24 -
Microsoft Обновляет Клиент Zune
19 Oct, 24