2017-02-21 8 views
14

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

Из-за какого-то нового усовершенствования мы теперь пытаемся добиться того же, используя клиентские банки IBM вместо Active MQ.

Проблема, с которой я столкнулась, заключается в том, что я могу подключиться к удаленному серверу inboundQ и отправлять сообщения. Но я всегда получаю нуль от исходящей очереди удаленных серверов. Но я не могу проверить, получены ли сообщения в удаленном месте. Но одно и то же сообщение при отправке через старую систему ActiveMQ получит ответ от удаленного сервера MQ.

Старый Active MQ внутренне использует мост для подключения к удаленному серверу IBM MQ, который настроен точно так же, как новый код, который я использую.

Я пробовал несколько кодов из Интернета и переполнения стека и всегда могу подключиться, но не получаю никаких ответов.

Кроме того, у меня нет ошибок и исключений при попытке отправить или получить удаленный IBM MQ.

Вставьте образец кода, который я пытаюсь получить на работу. Я изменил некоторые значения конфигурации в коде.

Мои сомнения следующие.

  1. Все, что я делаю для этого копирования клиента банки IBM MQ в приложение и использовать код для отправки сообщений на удаленный MQ. Я еще не установил какое-либо другое приложение. Будет ли такая система работать или всегда должна быть какая-то промежуточная программа, например, активная MQ?

  2. Тот же код может отправлять и получать с сервера IBM MQ, который я установил в нашей локальной сети, но не смог получить ответ с удаленного сервера? Это заставляет меня поверить, что я ничего не теряю в конфигурации? нужно ли что-либо еще настроить, кроме кода?

  3. Я не вижу ошибок и исключений. Всегда отправляется сообщение, но ответ равен нулю. Я не видел использования имени пользователя-пароля или аутентификации с открытым ключом. Существует ли обычная проверка подлинности для проверки источника. ?

  4. Я использую версию IBM MQ client 5.3, которая, как я знаю, является старой. Но использовали это, так как они работают с активной настройкой MQ, используют то же самое и работают правильно. У меня нет возможности узнать, какая версия на сервере IBM MQ присутствует на удаленной машине. Есть ли проблема, если мы используем другую версию клиента MQ, чем версия версии сервера MQ. ?

Пример кода, который работает для меня в местной среде, т.е. может посылать и получать от сервера IBM MQ я установил в другой машине в локальной сети. Тот же код будет получать нулевой ответ, когда я пытаюсь использовать его с удаленным сервером IBM MQ.

import javax.jms.*; 
import javax.jms.JMSException; 
import com.ibm.mq.jms.*; 
import com.ibm.jms.JMSMessage; 
import javax.jms.TextMessage; 

public class SendReceive { 
    private MQQueueConnectionFactory connectionFactory; 
    private MQQueueConnection connection; 

    private void runTest() { 
     try { 
      connect(); 
      connection.start(); 
      MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE");  /* values replaced with correct values in deployment server */ 
      MQQueue queue2 = (MQQueue) session.createQueue("OUTBOUND_QUEUE"); /* values replaced with correct values in deployment server */ 
      MQQueueSender sender = (MQQueueSender) session.createSender(queue);  

      MQQueueReceiver receiver = (MQQueueReceiver) session.createReceiver(queue2); 

      //TextMessage message = session.createTextMessage("yesyesyes"); 
      String stt = "Test Message";  // 

      TextMessage message = session.createTextMessage(stt); 
      message.setJMSReplyTo(queue2); 
      sender.send(message); 
      System.out.println("Sent: " + message); 

      Message msg1 = receiver.receive(5000); 
      if(msg1!=null){ 
       String responseMsg = ((TextMessage) msg1).getText(); 
       System.out.println("Received: " + responseMsg); 
      }else{ 
       System.out.println("Message received is null"); 
      } 
     }catch(Exception e){ 
      System.out.println("Exception caught in program : " + e); 
      e.printStackTrace(); 
     } 
    } 

    public boolean connect() { 
     boolean connected = false; 
     try { 
      /* values below are replaced with correct values in deployment server */ 

      connectionFactory = new MQQueueConnectionFactory();    
      connectionFactory.setPort(1515); 
      connectionFactory.setHostName("192.168.1.23"); // 
      connectionFactory.setQueueManager("QCCMGR"); 
      connectionFactory.setChannel("QCHANNEL");    
      connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); 

      connection = (MQQueueConnection) connectionFactory.createQueueConnection(); 
      connected = true; 
     } catch (Exception e) { 
      connected = false; 
     } 
     return connected; 
    } 

    public static void main(String[] args) { 
     new SendReceive().runTest(); 
    } 

} 
+0

@JoshMc Образец программы запускается на той же машине под тем же пользователем с аналогичными конфигурациями. Это не позволяет получить ошибку или исключение, когда я пытаюсь подключиться для отправки или получения. Удаленная система, по которой я отправляю сообщения, не принадлежит компании, над которой я работаю, поэтому у меня нет возможности проверить, получают ли они ее или нет. Но удаленный сервер дает ответ на отправку сообщений с моста activeMQ, который использует банку MQ5.3. Причина, по которой я использовал 5.3, - это только то, что использовала старая рабочая система. Я намерен попробовать более новую версию, но почему-то я чувствую, что мне не хватает какого-либо шага или конфигурации здесь. – Raj

+0

@JoshMc. Также старая настройка моста activeMQ использует две программы для отправки и одну для приема. Если я отправлю, используя старую настройку моста MQ, я уверен, что сообщение дойдет до пульта. Я попытался отправить с использованием старой системы, а затем попытался получить ответ, используя мою примерную программу. Тогда также я получаю пустое или нулевое значение как ответ. Но если я запустил старый pgm для получения после этого, я получу ответ на отправленное сообщение, которое означает, что сообщение присутствует в удаленной очереди, но по какой-то причине не отправлено на мой образец pgm. Почему это происходит, я не могу понять. – Raj

+0

Система @JoshMc использует 5 секунд. Я пробовал с 10,15,30 секунд, но все равно получаю только нуль в качестве ответа, поэтому я не думаю, что тайм-аут - это проблема.Я пробовал комментировать код для отправки части и работать только с получением части программы, но при этом нет ошибки при подключении, но ответ равен нулю. – Raj

ответ

2

MQ v5.3 был выпущен 29 ноября 2002 года и не поддерживается с 28 сентября 2007 года (почти 9 лет). Возможно, эта версия не имеет ничего общего с вашей проблемой, но я настоятельно рекомендую перейти к поддерживаемой версии клиента MQ. Новые клиентские версии MQ могут подключаться к более старым менеджерам очереди MQ.Вы можете скачать яву только установку MQ 8.0 или MQ 9.0 баночка файлов по указанным ниже ссылкам:


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

private void runTest() { 
     try { 
      connect(); 
      connection.start(); 
      MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      MQQueueSession session2 = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
      MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE");  /* values replaced with correct values in deployment server */ 
      MQQueue queue2 = (MQQueue) session2.createQueue("OUTBOUND_QUEUE"); /* values replaced with correct values in deployment server */ 
      MQQueueSender sender = (MQQueueSender) session.createSender(queue);  

      MQQueueReceiver receiver = (MQQueueReceiver) session2.createReceiver(queue2); 

      //TextMessage message = session.createTextMessage("yesyesyes"); 
      String stt = "Test Message";  // 

      TextMessage message = session.createTextMessage(stt); 
      message.setJMSReplyTo(queue2); 
      sender.send(message); 
      System.out.println("Sent: " + message); 

      Message msg1 = receiver.receive(5000); 
      if(msg1!=null){ 
       String responseMsg = ((TextMessage) msg1).getText(); 
       System.out.println("Received: " + responseMsg); 
      }else{ 
       System.out.println("Message received is null"); 
      } 
     }catch(Exception e){ 
      System.out.println("Exception caught in program : " + e); 
      e.printStackTrace(); 
     } 
    } 

Попробуйте принимать след JMS, добавив следующее выполнения Java приложения:

-DMQJMS_TRACE_LEVEL=base 
-DMQJMS_TRACE_DIR=/tracedirectory 

например: java -DMQJMS_TRACE_LEVEL=base -DMQJMS_TRACE_DIR=/tracedirectory JavaApp

Это должно создать файл, который я считаю, концы в .trc в указанном вами каталоге.

Вы можете просмотреть это на предмет ошибок, которые могут помочь вам в правильном направлении.


Предложения:

Попробуйте изменить программу, чтобы заставить его отправить пустое имя:

connection = (MQQueueConnection) connectionFactory.createQueueConnection("", ""); 

Попробуйте закрыть отправителя после sender.send называется

sender.close(); 

С дополнительной информацией трудно определить причину. Чем больше информации вы можете получить, тем лучше.

+0

Я пробовал программы только для приемников, где сеанс используется только для получения, поэтому не думайте, что это проблема. Но обязательно попробуем. – Raj

+0

Теперь я получаю доступ к системе развертывания только через неделю или около того, потому что там происходит какая-то другая работа. Тогда я попытаюсь получить след. и я уверен, что никакое другое приложение не связано с получением ответа. если я отправлю с использованием старой системы и попытаюсь получить с помощью новой системы, тогда никакого ответа, но только после этого, если я попробую использовать старую систему, я получу ответ. поэтому удаленная очередь имела ответ, но не отправляла в новую систему или почему-то терялась в пути. – Raj

+0

@Raj Я думаю, что эти две вещи дают хороший признак того, что ни отправлять, ни получать не работают. 1. отправить из старой системы и попытаться получить от новой системы, никакого ответа, запустить старый системный ресивер и сообщение. 2. отправлять с новой системы, ничего не получает старый системный ресивер. – JoshMc

0

Возможно, это была проблема с конфигурацией, связанной с сетью, или, возможно, Windows Messaging не настроен хорошо. Вы можете подумать о том, чтобы предоставить WebSphere MQ - Message Test Utility IBM, чтобы убедиться в отсутствии такой системы или конфигурации сети . вопросов присутствуют.

Смежные вопросы