Главная » Spring » Работа с шаблонами JMS в Spring

0

Механизм JMS дает разработчикам приложений на языке Java стандартный API для взаимодействия с брокерами сообщений, а также для отправки и приема сообщений. Кроме того, практически все существующие реализации брокеров сообщений поддерживают JMS. Поэтому нет причин изучать частные API обмена сообщения- ми для организации взаимодействий с брокерами.

Да, JMS предлагает универсальный интерфейс для работы с лю- быми брокерами, но за это удобство приходится платить. Отправить и принять сообщение с помощью JMS намного сложнее, чем просто шлепнуть печать на конверт. Как будет показано далее, JMS тре- бует, чтобы вы еще и заправили почтовый грузовик (фигурально выражаясь).

Борьба с разбуханием JMS-кода

В разделе 6.3.1 было показано, насколько громоздким может быть код для работы с JDBC, необходимый для обработки установления соединений, выполнения запросов, получения результатов и обра- ботки исключений. К сожалению, JMS API подвержен той же бо- лезни, как можно заметить в листинге 13.1.

Листинг 13.1. Отправка сообщения без привлечения Spring

ConnectionFactory  cf  =

new         ActiveMQConnectionFactory("tcp://localhost:61616");

Connection conn = null; Session session = null; try  {

conn    =    cf.createConnection();

session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination    destination    =    new    ActiveMQQueue("spitter.queue"); MessageProducer      producer      =      session.createProducer(destination); TextMessage   message   =   session.createTextMessage();

message.setText("Hello  world!");

producer.send(message);                                      // Отправка сообщения

}  catch  (JMSException  e)  {

// обработать исключение?

}  finally  {

try  {

if (session != null) { session.close();

}

if (conn  !=  null)  { conn.close();

}

}  catch  (JMSException  ex)  {

}

}

Ох уж этот шаблонный код! Как и в примере использования JDBC, потребовалось более 20 строк кода, только чтобы отправить простое сообщение «Hello world!». При этом к отправке сообщения прямое отношение имеют лишь несколько строк, остальные выпол- няют подготовительные операции.

Не лучше выглядит и реализация приема сообщения, как пока- зано в листинге 13.2.

Листинг 13.2. Прием сообщения без привлечения Spring

ConnectionFactory  cf  =

new         ActiveMQConnectionFactory("tcp://localhost:61616");

Connection conn = null; Session session = null; try  {

conn   =   cf.createConnection(); conn.start();

session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination     destination     =

new    ActiveMQQueue("spitter.queue");

MessageConsumer    consumer    =    session.createConsumer(destination); Message   message   =   consumer.receive();

TextMessage  textMessage  =  (TextMessage)  message;

System.out.println("GOT  A  MESSAGE:  "  +  textMessage.getText()); conn.start();

}  catch  (JMSException  e)  {

// обработать исключение?

}  finally  {

try  {

if (session != null) { session.close();

}

if (conn  !=  null)  { conn.close();

}

}  catch  (JMSException  ex)  {

}

}

И снова, как в листинге 13.1, здесь используется масса шаблон- ного кода. Если провести построчное сравнение, можно обнаружить, что эти два листинга практически идентичны. И если посмотреть на тысячи других примеров использования JMS, можно с тем же успехом заметить их поразительное сходство. Где-то вместо фабри- ки соединений используется JNDI, а где-то вместо очередей исполь- зуются темы, но все они следуют одному и тому же шаблону.

Как следствие при работе с JMS вы постоянно будете обнаружи- вать, что пишете один и тот же код снова и снова. Хуже того, вы будете обнаруживать, что повторяете программный код, написанный другими разработчиками.

В главе 6 уже было показано, как использование класса JdbcTemplate позволяет избавиться от шаблонного кода при работе с JDBC. Те- перь пришло время посмотреть, как тот же эффект помогает полу- чить класс JmsTemplate при работе с JMS.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии