Как подключиться к ДИСПЕТЧЕРУ ОЧЕРЕДЕЙ сервера MQ с помощью клиента MQ

#ibm-mq #mq

#ibm-mq #mq

Вопрос:

Я пытался отправить сообщение на сервер MQ с помощью клиента MQ

Ошибка: — Произошла ошибка WebSphere MQ: код завершения 2 Код причины 2058.Я знаю этот код причины из-за неправильного имени диспетчера очередей .. Но имя диспетчера очередей правильное…

После установки клиента WebSphere MQ я просто запускаю команду: SET MQSERVER=QM_ORANGE/TCP/IPADDRESS(НОМЕР ПОРТА)

и запустите эту программу открытого класса MQSample {

   // code identifier
  static final String sccsid = "@(#) MQMBID sn=p750-002-131001_DE su=_FswqMCqGEeOZ3ui-rZDONA pn=MQJavaSamples/wmqjava/MQSample.java";

  // define the name of the QueueManager
  private static final String qManager = "QM_ORANGE";
  // and define the name of the Queue
  private static final String qName = "Q1";

  /**
   * Main entry point
   * 
   * @param args - command line arguments (ignored)
   */
  public static void main(String args[]) {
    try {
      // Create a connection to the QueueManager
      System.out.println("Connecting to queue manager: "   qManager);
      MQQueueManager qMgr = new MQQueueManager(qManager);

      // Set up the options on the queue we wish to open
      //int openOptions = MQConstants.MQOO_INPUT_AS_Q_DEF | MQConstants.MQOO_OUTPUT;
      int openOptions = MQConstants.MQOO_OUTPUT;
     // int openOptions1 = MQConstants.MQOO_INPUT_AS_Q_DEF;
      // Now specify the queue that we wish to open and the open options
      System.out.println("Accessing queue: "   qName);
      MQQueue queue = qMgr.accessQueue(qName, openOptions);
      //MQQueue queue1 = qMgr.accessQueue(qName, openOptions1);
      // Define a simple WebSphere MQ Message ...
      MQMessage msg = new MQMessage();
      // ... and write some text in UTF8 format
      msg.writeUTF("Hello, World!");

      // Specify the default put message options
      MQPutMessageOptions pmo = new MQPutMessageOptions();

      // Put the message to the queue
      System.out.println("Sending a message...");
      queue.put(msg, pmo);


      //



         openOptions = MQC.MQOO_INQUIRE   MQC.MQOO_FAIL_IF_QUIESCING
                  MQC.MQOO_INPUT_SHARED;

         queue = qMgr.accessQueue("QM_APPLE", openOptions,
                null, // default q manager
                null, // no dynamic q name
                null); // no alternate user id

        System.out.println("MQRead v1.0 connected.n");

        int depth = queue.getCurrentDepth();
        System.out.println("Current depth: "   depth   "n");
        if (depth == 0) {
            return;
        }

        MQGetMessageOptions getOptions = new MQGetMessageOptions();
        getOptions.options = MQC.MQGMO_NO_WAIT   MQC.MQGMO_FAIL_IF_QUIESCING
                  MQC.MQGMO_CONVERT;
        while (true) {

            MQMessage message = new MQMessage();
            try {
                queue.get(message, getOptions);

                byte[] b = new byte[message.getMessageLength()];
                message.readFully(b);
                System.out.println(new String(b));
                message.clearMessage();
            } catch (IOException e) {
                System.out.println("IOException during GET: "   e.getMessage());
                break;
            } catch (MQException e) {
                if (e.completionCode == 2
                        amp;amp; e.reasonCode == MQException.MQRC_NO_MSG_AVAILABLE) {
                    if (depth > 0) {
                        System.out.println("All messages read.");
                    }
                } else {
                    System.out.println("GET Exception: "   e);
                }
                break;
            }
        }
        queue.close();
        //_queueManager.disconnect();

      // Disconnect from the QueueManager
      System.out.println("Disconnecting from the Queue Manager");
      qMgr.disconnect();
      System.out.println("Done!");
    }
    catch (MQException ex) {
      System.out.println("A WebSphere MQ Error occured : Completion Code "   ex.completionCode
            " Reason Code "   ex.reasonCode);
      ex.printStackTrace();
      for (Throwable t = ex.getCause(); t != null; t = t.getCause()) {
        System.out.println("... Caused by ");
        t.printStackTrace();
      }

    }
    catch (java.io.IOException ex) {
      System.out.println("An IOException occured whilst writing to the message buffer: "   ex);
    }
    return;
  }
}
  

Ответ №1:

Вы установили переменную MQSERVER среды. MQ C Client понимает эту переменную среды и соответственно подключается к диспетчеру очередей, запущенному на компьютере, указанном в IP-адресе. MQ Java ведет себя по-другому.

В вашем приложении вы указали только имя диспетчера очередей в MQQueueManager конструкторе. Это означает, что приложение хочет подключиться к диспетчеру очередей, работающему на том же компьютере, через соединение с привязками сервера.

Для подключения к диспетчеру очередей можно выполнить следующие действия: (измените имя хоста, порта, канала и диспетчера очередей). Обратите внимание, что пример написан с использованием Java-клиента MQ v8.

           Hashtable properties = new Hashtable<String, Object>();
          properties.put(MQConstants.HOST_NAME_PROPERTY, "qm.mycomp.com");
          properties.put(MQConstants.PORT_PROPERTY, 1414); 
          properties.put(MQConstants.CHANNEL_PROPERTY, "APP.SVRCONN"); 
          properties.put(MQConstants.USE_MQCSP_AUTHENTICATION_PROPERTY,"true");
          properties.put(MQConstants.USER_ID_PROPERTY, "myuserid");
          properties.put(MQConstants.PASSWORD_PROPERTY, "passw0rd");

          /**
           * Connect to a queue manager 
           */
          MQQueueManager queueManager = new MQQueueManager("QM", properties);
  

Обновить

Итак, вы не хотите жестко кодировать параметры подключения в своей программе? Вы можете использовать переменную среды MQSERVER самостоятельно, получить ее, проанализировать ее и параметры подключения. Для получения информации о подключении можно также использовать файл конфигурации или сервер LDAP.

Обновление II

Вы вообще не читали документацию по MQ. Клиент MQ представляет собой набор библиотек / jar / .net сборок и т.д., которые предоставляют API-интерфейсы на разных языках. Вы разрабатываете приложение, используя эти API для взаимодействия с диспетчером очередей. Это то, что вы сделали в своей программе выше. Без этих библиотек вы не сможете подключиться к диспетчеру очередей (многие люди считают диспетчер очередей сервером). Когда ваше приложение выполняется на том же компьютере, что и диспетчер очередей, можно взаимодействовать с диспетчером очередей через общую память. Но при запуске на другой машине связь осуществляется по протоколу TCP / IP (или SNA).

Надеюсь, это устранит путаницу.

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

1. Да, сэр .. это будет работать, когда диспетчер очередей работает на том же компьютере… Но на самом деле мое требование — подключить диспетчер очередей, который работает на сервере, через клиент без указания IP-адреса в коде . Можно ли установить IP-адрес сервера с помощью любой команды??

2. Нет без использования среды variable…as я упомянул, что в моей программе передается только имя менеджера очередей…. У меня есть файл mqclient.ini, который содержит TCP: Library1=DLLName1 KeepAlive=Yes ClntSndBuffSize=32768 ClntRcvBuffSize=32768 Connect_Timeout=0 CHANNELS: DefRecon=YES ServerConnectionParms=QM_ORANGE.QM_APPLE1/TCP/192.168.1.5(1414)

3. Без имени хоста / IP-адреса, порта и канала приложение не может подключиться к диспетчеру очередей, работающему на другом компьютере.

4. Используя только имя, вы можете подключиться только к диспетчеру очередей, работающему на том же компьютере.

5. @шаши- Хорошо, сэр. Тогда для чего нужен клиент MQ?? Я уже подключался к серверу через порт и IP-адрес раньше, без использования клиента…