Взаимодействие из Java с IBM Websphere MQ 6

Я уже рассказывал о том, как получать и отправлять сообщения с помощью 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 объектов.

Необходимые библиотеки можно найти в директории ${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 вы можете найти здесь.

Комментариев нет: