Как использовать Java JMS с MQseries - PullRequest
31 голосов
/ 04 августа 2011

Я пытаюсь разработать автономное приложение JMS для чтения и записи в очередь на MQSeries.Мой босс попросил меня использовать pure java JMS (не ibm.mq lib) для этого.

Вот информация, которая необходима для соединения jms:

  mq.hostname=10.10.10.10
  mq.channel=API.CLIENTCHL
  mq.queueManager=MQPETAPI
  mq.port=1422

Знаете ли вы, как это сделать? Или у вас есть какая-нибудь ссылка, которая учит меня это делать.

Ответы [ 6 ]

48 голосов
/ 04 августа 2011

Проблема здесь заключается в том, что «мой босс попросил меня использовать чистую java JMS (не ibm.mq lib) для этого».JMS - это спецификация, и каждая реализация должна соответствовать API и семантике, но может свободно делать все, что захочет, на низком уровне.Всегда необходимо использовать классы реализации, предоставляемые поставщиком транспорта.Поэтому, если вы используете WebSphere MQ в качестве транспорта, вам нужно будет использовать классы IBM MQ JMS для написания приложения JMS.

Тем не менее, если вы будете придерживаться чисто вызовов JMS API, вы сможете подключитьклассы любого транспортного поставщика.Это то, что обычно подразумевается, когда вам предъявляются такие требования, как те, которые упомянуты в исходном посте.

Есть статья, описывающая в точности то, что вы хотите сделать, под названием Запуск автономного Java-приложения наWebSphere MQ V6.0 Он использует только API-интерфейс JMS и JNDI в локальной файловой системе (файл .bindings).Меняя местами классы IBM JMS для другого поставщика и используя их инструменты JNDI, вы сможете подключить любой транспорт JMS без изменения кода с помощью этого подхода.

Если вы хотите сделать то же самое без JNDI,посмотрите примеры программ, поставляемых с MQ-клиентом, где вы получили классы Java.В системе UNIX / Linux они находятся в /opt/mqm/samp, а в Windows - в install_dir/tools/jms/samples.Пример SimpleRequestor.java содержит следующий код для инициализации фабрики соединений без JNDI:

try {
  // Create a connection factory
  JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  JmsConnectionFactory cf = ff.createConnectionFactory();

  // Set the properties
  cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "localhost");
  cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
  cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN");
  cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
  cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "QM1");

Поскольку этот подход не использует JNDI, необходимо написать код, который нельзя переносить между поставщиками транспорта.Это специфично для IBM WebSphere MQ.

Если вы взяли банки MQ откуда-то и не имеете полной установки (и, следовательно, не имеете примеров), вы можете загрузить их как SupportPac MQC7 ,Загрузка бесплатна.В общем случае вы должны использовать самую последнюю версию клиента, даже с администратором очередей на обратном уровне.Очевидно, вы не получаете функциональность V7 от V6 QMgr, но реализация JMS в клиенте V7 значительно улучшена, даже для функциональности V6.Если по какой-то причине вам действительно нужно использовать клиент V6, вы можете загрузить его как SupportPacMQC6 .Какую бы версию клиента вы не использовали, обязательно используйте соответствующий Инфоцентр.

V6 Инфоцентр
V7 Инфоцентр

Наконец, целевая страницас индексом для всех SupportPacs здесь .

10 голосов
/ 06 августа 2015

Полное (синхронное) автономное приложение JMS с TextMessage.
Это специфично для IBM WebSphere MQ.

import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;

public class JMSApplicationStandAlone {
    public static void main(String[] args) {
        try {
            /*MQ Configuration*/
            MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
            mqQueueConnectionFactory.setHostName("localhost");
            mqQueueConnectionFactory.setChannel("MQ.CHANNEL");//communications link
            mqQueueConnectionFactory.setPort(1416);
            mqQueueConnectionFactory.setQueueManager("QUEUE.MGR");//service provider 
            mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

            /*Create Connection */
            QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
            queueConnection.start();

            /*Create session */
            QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            /*Create response queue */
            Queue queue = queueSession.createQueue("QUEUE.RESPONSE");


            /*Create text message */
            TextMessage textMessage = queueSession.createTextMessage("put some message here");
            textMessage.setJMSReplyTo(queue);
            textMessage.setJMSType("mcd://xmlns");//message type
            textMessage.setJMSExpiration(2*1000);//message expiration
            textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt

            /*Create sender queue */
            QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));
            queueSender.setTimeToLive(2*1000);
            queueSender.send(textMessage);

            /*After sending a message we get message id */
            System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
            String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";


            /*Within the session we have to create queue reciver */
            QueueReceiver queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);


            /*Receive the message from*/
            Message message = queueReceiver.receive(60*1000);
            String responseMsg = ((TextMessage) message).getText();

            queueSender.close();
            queueReceiver.close();
            queueSession.close();
            queueConnection.close();


        } catch (JMSException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Примечание. Замените конфигурациюзначения

9 голосов
/ 04 августа 2011

Если вы не против написания кода, специфичного для WMQ, тогда вы можете

MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);

, затем обычные ресурсы JMS

Connection c = cf.createConnection();
Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = s.createQueue("myQueue"); // replace with real queue name
MessageProducer p = s.createProducer(q);

и, наконец, создать и отправить сообщение

Message m = s.createTextMessage("Hello, World!);
p.send(m);

(я набрал это на макушке, поэтому не могу исключить опечатку, но это в принципе правильно).Если вы действительно предполагаете использовать «чистый JMS» - то есть без каких-либо специфичных для провайдера объектов - тогда вам нужно связать объект MQConnectionFactory в JNDI (взгляните на инструмент JMSAdmin, он находится в документации), затем посмотритеиз вашего приложения, т.е.

InitialContext ic = new InitialContext(); // or as appropraite
ConnectionFactory cf = (ConnectionFactory)ic.lookup("myMQfactory"); // replace with JNDI name
3 голосов
/ 04 августа 2011

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

Если вы хотите отказаться от JNDI, вы можете создать экземпляр com.ibm.mq.jms.MQQueueConnectionFactory напрямую и задать имя хоста, port, queueManager и свойства канала на нем.Затем вы можете использовать этот объект как экземпляр javax.jms.QueueConnectionFactory, так как он его реализует.

2 голосов
/ 04 августа 2011

Я не могу научить вас JMS в одном посте, но я могу указать вам на некоторые ресурсы, которые я использовал, чтобы изучить его самостоятельно:

  1. Служба сообщений Java O'Reilly книга
  2. Учебное пособие по IBM Developerworks JMS (больше для MQSeries / Websphere MQ)
  3. Платформа Spring может помочь вам более эффективно использовать JMS, особенно если вы разрабатываете отдельное приложение вне сервера приложений J2EE: Документация Spring Java Message Service
0 голосов
/ 04 августа 2011

Это довольно часто. Здесь - несколько примеров.

...