Подтвердить что ты не робот

Как использовать Java JMS с MQseries

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

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

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

Вы знаете, как это сделать или у вас есть какая-то связь, которая научит меня делать это.

4b9b3361

Ответ 1

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

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

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

Если вы хотите сделать то же самое без JNDI, посмотрите примеры программ, поставляемых с установкой клиента MQ, где вы получили свои Java-классы. В системе UNIX/Linux они находятся в /opt/mqm/samp, а в Windows они находятся в install_dir/tools/jms/samples. Образец SimpleRequestor.java имеет следующий код для инициализации вашего соединения factory без 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. Какую бы версию клиента вы не использовали, обязательно используйте соответствующий Infocenter.

V6 Infocenter
V7 Infocenter

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

Ответ 2

Если вы не против писать код, специфичный для 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

Полное (синхронное) автономное 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();
        }
    }
}

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

Ответ 4

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

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

Ответ 5

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