JMS-сеанс также функционирует как фабрика для получателей JMS-сообщений. JMSклиент использует получателя сообщений для получения сообщений из пункта назначения в провайдере JMS. Получатель JMS-сообщений не поддерживает параллельное использование.
Интерфейс получателя сообщений, как он определен в спецификации JMS, показан в табл. 8.7.
Вспомните из обсуждения в разделе «Получатели сообщений», что получатели могут работать в режиме извлечения (pull) и режиме приема (push). В спецификации JMS определяются получатели сообщений для обоих режимов. Получатели, работающие в этих режимах, рассматриваются в следующих разделах.
Режим извлечения
JMS-клиент в режиме извлечения просто вызывает один из методов получения сообщения объекта MessageConsumer. Интерфейс MessageConsumer предлагает разные методы получения, позволяющие клиенту запрашивать пункт назначения или ждать поступления следующего сообщения.
Код, необходимый для получения сообщения в режиме извлечения, показан в примере 8.6.
Пример 8.6. Получение JMS-сообщения в режиме извлечения
// Создание получателя сообщений
MessageConsumer msgConsumer = session.createConsumer(destination);
// Запуск соединения
conn1.start();
// Попытка получить сообщение
Message msg = msgConsumer.receiveNoWait();
// Проверка наличия текстовых сообщений if (msg instanceof TextMessage) {
// Приведение сообщения к нужному типу TextMessage txtMsg = (TextMessage)msg;
// Вывод содержимого сообщения
System.out.println(txtMsg.getText()); }
Примечание. Перед попыткой получения сообщения необходимо вызвать метод start объекта Connection. Соединение не нужно запускать для передачи сообщений, а только для получения. Это позволяет приложению выполнить все необходимые шаги по конфигурированию перед попыткой получения сообщения.
Чтобы реализовать решение, в котором используется метод приема (push), JMSклиент должен зарегистрировать в объекте MessageConsumer объект, реализующий интерфейс javax.jms.MessageListener. Когда такой объект-получатель запросов зарегистрирован, JMS-провайдер доставляет сообщения по мере их поступления, используя метод onMessage получателя запросов.
Интерфейс javax.jms.MessageListener показан в примере 8.7.
Пример 8.7. Интерфейс javax.jms.Messa geListene r
package javax.jms;
public interface MessageListener {
public void onMessage(Message message);
}
Простой класс, реализующий интерфейс javax.jms.MessageListener, показан в примере 8.8.
Пример 8.8. Простая реализация Messa geListene r package com.ibm.itso.jms;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener; import javax.jms.TextMessage;
public class SimpleListener implements MessageListener {
public void onMessage(Message msg)
{
// Make sure that we have a text message if (msg instanceof TextMessage) {
// Cast the message to the correct type TextMessage txtMsg = (TextMessage)msg;
try
{
// Print the contents of the message System.out.println(txtMsg.getText()); }
catch (JMSException e) {
e.printStackTrace();
}
}
}
}
Экземпляр объекта-получателя запросов теперь может быть зарегистрирован клиентским JMS-приложением в объекте-получателе JMS-сообщений. После регистрации получателя запросов нужно запустить соединение, чтобы сообщения можно было доставлять получателю. Код, необходимый для регистрации получателя запросов в получателе JMS-сообщений показан в примере 8.9.
Пример 8.9. Получение JMS-сообщения с помощью метода приема import com.ibm.itso.jms.SimpleListener;
// Создание получателя сообщений
MessageConsumer msgConsumer = session.createConsumer(destination);
// Создание экземпляра получателя запросов
SimpleListener listener = new SimpleListener();
// Регистрация получателя запросов в получателе сообщений msgConsumer.setMessageListener(listener);
// Запуск соединения
conn1.start();
Примечание. В JMS-домене Точка-Точка сообщения остаются в пункте назначения до тех пор, пока их не получит получатель или пока не истечет срок их хранения. В домене Публикация/ Подписка сообщения остаются в пункте назначения до тех пор, пока они не будут доставлены всем зарегистрированным подписчикам или пока не истечет срок их хранения. Чтобы сообщение сохранялось в то время, когда приложение-подписчик недоступно, подписчик должен создать долгосрочную подписку. Обращайтесь за дополнительной информацией к разделу «Долгосрочные подписки в домене Публикация/Подписка».