Я уже рассказывал о том, как получать и отправлять сообщения с помощью JMS. Но мой рассказ строился на том, что JNDI контекст уже получен, хотя его получение достаточно нетривиальная задача. Сегодня я постараюсь восполнить этот пробел. |
Использование Filesystem JNDI provider для связывания с MQ
Создание файла JNDI bindings в WebSphere MQ 6
WebSphere MQ позволяет сформировать описание объектов JNDI следующим образом:
Выбираем JMS Administratered Objects -> Add Initial Context...
В открывшемся мастере выбираем расположение JNDI, как File System и указываем пустую директорию:
Context nickname оставляем без изменения и жмем Finish:
В новом администрируемом объекте выбираем создание новой фабрики подключений:
Далее указываем псевдоним фабрики (под этим именем фабрика будет доступна позже в коде), задаем в качестве Messaging provider - WebSphere MQ:
В качестве типа фабрики указываем Queue Connection Factory:
Тип транспорта задаем как MQ Client. Это позволит обращаться к MQ с машины, на которой не стоит менеджер очередей:
Через пару шагов, на которых все остается по умолчанию, создание фабрики будет закончено, останется только настроить созданную фабрику. Для этого необходимо указать существующий менеджер очередей, с которым планируется взаимодействовать, имя хоста машины, на которой располагается MQ, и порт выбранного менеджера:
На этом настройки фабрики окончены. Единственное, стоит убедится в том, что в качестве канала указан SYSTEM.DEF.SVRCONN
Теперь создадим описание очереди сообщений.
Указываем псевдоним очереди, по которому будем обращаться к ней в коде:
В качестве типа объекта задаем Queue (или Topic, при необходимости):
Следующий шаг можно оставить как есть, и на последнем шаге указать менеджер очереди и непосредственно очередь, для которой создаем описание:
Теперь в директории, указанной в самом начале, создан файл .bindings, описывающий объекты JMS.
Выбираем JMS Administratered Objects -> Add Initial Context...
В открывшемся мастере выбираем расположение JNDI, как File System и указываем пустую директорию:
Context nickname оставляем без изменения и жмем Finish:
В новом администрируемом объекте выбираем создание новой фабрики подключений:
Далее указываем псевдоним фабрики (под этим именем фабрика будет доступна позже в коде), задаем в качестве Messaging provider - WebSphere MQ:
В качестве типа фабрики указываем Queue Connection Factory:
Тип транспорта задаем как MQ Client. Это позволит обращаться к MQ с машины, на которой не стоит менеджер очередей:
Через пару шагов, на которых все остается по умолчанию, создание фабрики будет закончено, останется только настроить созданную фабрику. Для этого необходимо указать существующий менеджер очередей, с которым планируется взаимодействовать, имя хоста машины, на которой располагается MQ, и порт выбранного менеджера:
На этом настройки фабрики окончены. Единственное, стоит убедится в том, что в качестве канала указан SYSTEM.DEF.SVRCONN
Теперь создадим описание очереди сообщений.
Указываем псевдоним очереди, по которому будем обращаться к ней в коде:
В качестве типа объекта задаем Queue (или Topic, при необходимости):
Следующий шаг можно оставить как есть, и на последнем шаге указать менеджер очереди и непосредственно очередь, для которой создаем описание:
Теперь в директории, указанной в самом начале, создан файл .bindings, описывающий объекты JMS.
Получение контекста и создание JMS объектов.
Необходимые библиотеки можно найти в директории ${MQ_PATH}/java/lib, где ${MQ_PATH} - путь к директории, в которую установлена WebSphere MQ. В частности, нужны fscontext.jar, jms.jar, jndi.jar.
/* URL адрес директории с файлом .bindings */
String providerUrl = "file://F:\\EmptyFolder";
/* Псевдоним менеджера из файла .bindings */
String qFactoryName = "MQ_Manager";
/* Псевдоним очереди из файла .bindings */
String qName;
/* Задаются свойства контекста */
Properties env = new Properties();
env.put(Context.PROVIDER_URL, providerUrl);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.fscontext.RefFSContextFactory");
/* Создается контекст */
Context ctx = new InitialContext(env);
/* Создаются фабрика и очередь */
QueueConnectionFactory factory =
(QueueConnectionFactory) ctx.lookup(qFactoryName);
Queue queue = (Queue) ctx.lookup(qName);
ctx.close();
Связывание с MQ через специфическое API
Код
Альтернативным вариантом связывания с MQ, является возможность создавать фабрики и очереди с помощью API предоставляемого ibm. Для этого необходима следующая библиотека из ${MQ_PATH}/java/lib: com.ibm.mqjms.jar.
/* Адрес машины с MQ */
String host = "localhost";
/* Номер порта менеджера очередей */
int port = 1414;
/* Имя менеджера очередей, к которому надо подключиться */
String qFactoryName;
/* Имя очереди, с которой планируется взаимодействие */
String qName;
/*
* Создание фабрики очередей
*/
MQQueueConnectionFactory factory = new MQQueueConnectionFactory();
factory.setCCSID(1251);
factory.setChannel("SYSTEM.DEF.SVRCONN");
factory.setHostName(host);
factory.setPort(port);
factory.setQueueManager(qFactoryName);
factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
/*
* Создание очереди сообщений
*/
MQQueue queue = new MQQueue();
queue.setBaseQueueManagerName(qFactoryName);
queue.setBaseQueueName(qName);
queue.setPersistence(JMSC.MQJMS_PER_APP);
queue.setExpiry(JMSC.MQJMS_EXP_APP);
queue.setPriority(JMSC.MQJMS_PRI_APP);
queue.setTargetClient(JMSC.MQJMS_CLIENT_JMS_COMPLIANT);
queue.setEncoding(JMSC.MQJMS_ENCODING_NATIVE);
queue.setCCSID(1251);
Описание использованных параметров объекта JMSC (взято с ibm.com)
MQJMS_TP_CLIENT_MQ_TCPIP
This parameter can be passed to MQConnectionFactory.setTransportType(int) to indicate that the application will connect to the queue manager in (client TCP/IP) mode.
MQJMS_PER_APP
This parameter can be passed to MQDestination.setPersistence(int) to indicate that the persistence is set to the value supplied by the application. This is the default behavior.
MQJMS_EXP_APP
This parameter can be passed to MQDestination.setExpiry(long) to indicate that the message expiry time is set to the value supplied by the application. This is the default behavior.
MQJMS_PRI_APP
This parameter can be passed to MQDestination.setPriority(int) to indicate that the priority is set to the value supplied by the application. This is the default behavior.
MQJMS_CLIENT_JMS_COMPLIANT
This parameter can be passed to MQDestination.setTargetClient(int) to indicate that messages will be sent to a client running the WebSphere® MQ JMS client. This is the default value.
Приведенные параметры фабрики и очереди оказались подходящими для решения моих задач, в вашем случае конфигурация JMS объектов может отличаться от приведенной. Полное описание API пакета com.ibm.mq.jms вы можете найти здесь.
Комментариев нет:
Отправить комментарий