Изучаем Java EE 7 - [202]

Шрифт
Интервал

Методами send() или publish()
JMSPriorityJMS имеет десятиуровневую шкалу приоритета, где 0 — минимальное значение, а 9 — максимальноеМетодами send() или publish()

Свойства

Помимо полей заголовка, интерфейс javax.jms.Message поддерживает значения свойств, которые похожи на заголовки, но явно создаются конкретным приложением, вместо того чтобы быть стандартным для всех сообщений. Это обеспечивает механизм добавления дополнительных полей заголовка сообщения, которые клиент получит либо не получит с помощью селекторов. Значения свойств могут иметь тип boolean, byte, short, int, long, float, double и String. Код для установки и получения значения свойств выглядит следующим образом:

>message.setFloatProperty("orderAmount", 1245.5f);

>message.getFloatProperty("orderAmount");

Тело сообщения

Тело сообщения не является обязательным и включает данные, которые следует отправить или получить. В зависимости от используемого интерфейса оно может содержать различные форматы данных, как показано в табл. 13.3.


Таблица 13.3. Типы сообщений
ИнтерфейсОписание
StreamMessageСообщение, тело которого содержит поток примитивных значений Java. Заполняется и считывается последовательно
MapMessageСообщение, тело которого содержит набор пар «имя/значение», чьи имена имеют тип String, а значения — примитивные значения Java
TextMessageСообщение, тело которого содержит строку (например, XML)
ObjectMessageСообщение, которое содержит сериализуемый объект или коллекцию сериализуемых объектов
BytesMessageСообщение, которое содержит поток байтов

Можно создать собственный формат сообщения, если вы создадите класс, наследующийся от интерфейса javax.jms.Message. Следует отметить, что при получении сообщения его тело доступно только для чтения. В зависимости от типа сообщения существуют различные методы, позволяющие получить доступ к его содержимому. Текстовое сообщение будет иметь методы getText() и setText(), сообщение-объект — методы getObject() и setObject() и т. д.:

>textMessage.setText("This is a text message");

>textMessage.getText();

>bytesMessage.readByte();

>objectMessage.getObject();

С появлением версии JMS 2.0 новый метод T getBody(Class c) возвращает тело сообщения как объект указанного типа.

Отправка и получение сообщений с помощью классического API

Рассмотрим простой пример, чтобы получить представление о том, как нужно использовать классический JMS API для отправки и получения сообщений. JMS работает с производителями, потребителями и местами назначения. Производитель посылает сообщение по месту назначения, где потребитель ждет прибытия сообщения. Места назначения могут быть двух видов: очередь (для связи «от точки к точке») и тема (для связи «публикация-подписка»). В листинге 13.2 производитель посылает текстовое сообщение в очередь, которую слушает потребитель.


Листинг 13.2. Класс-производитель создает сообщение и помещает его в очередь с помощью классического API

>public class Producer {

>··public static void main(String[] args) {


>·····try {

>······// Получает контекст JNDI

>······Context jndiContext = new InitialContext();


>······// Выполняет поиск администрируемых объектов

>······ConnectionFactory connectionFactory = (ConnectionFactory) 

>························jndiContext.lookup("jms/javaee7/ConnectionFactory");

>······Destination queue = (Destination) jndiContext.lookup("jms/javaee7/Queue");


>······//Создает необходимые артефакты для соединения с очередью

>······Connection connection = connectionFactory.createConnection();

>······Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

>······MessageProducer producer = session.createProducer(queue);

>······// Отправляет текстовое сообщение в очередь

>······TextMessage message = session.createTextMessage("Сообщение отправлено " + new Date());

>······producer.send(message);


>······connection.close();


>····}··catch (NamingException | JMSException e) {

>······e.printStackTrace();

>····}

>··}

>}

Данный код представляет класс Producer, который имеет только метод main(). Первое, что происходит в этом методе, — создается контекст JNDI и затем используется для получения объектов типа ConnectionFactory и Destination.

Фабрики соединений и места назначения (очереди и темы) являются администрируемыми объектами и должны быть созданы и объявлены в поставщике сообщений (в нашем случае в OpenMQ GlassFish). Они оба имеют имя JNDI (например, очередь называется jms/javaee7/Queue); их следует искать в дереве JNDI.

Когда получены два администрируемых объекта, класс Producer использует класс ConnectionFactory, чтобы создать объект типа Connection, из которого будет получен объект типа Session. С помощью этого сеанса в очереди по месту назначения создаются объект типа MessageProducer и сообщение (session.createProducer(queue)). Производитель посылает это сообщение (текстового типа). Обратите внимание, что класс main ловит исключение JNDI NamingException, а также JMSException.

К счастью, код получения сообщения выглядит примерно так же, как и код для его отправки. Действительно, первые строки класса Consumer в листинге 13.3 точно такие же: создается контекст JNDI, выполняется поиск фабрики соединений и места назначения, затем осуществляется подключение. Различия заключаются в том, что вместо MessageProducer используется MessageConsumer и приемник входит в бесконечный цикл, чтобы слушать очередь (вы позже увидите, что зацикливания можно избежать, если использовать более стандартный слушатель сообщений). Когда приходит сообщение, оно потребляется и отображается его содержимое.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.