Отсутствие ответа при использовании клиентских банков IBM MQ в приложении для подключения к серверу IBM MQ

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

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

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

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

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

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

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

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

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

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

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

  • Я использую версию 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();
    }

}

Ответы

Ответ 1

MQ v5.3 был выпущен 29 ноября 2002 года и не поддерживается с 28 сентября 2007 года (почти 9 лет). Возможно, эта версия не имеет ничего общего с вашей проблемой, но я настоятельно рекомендую перейти к поддерживаемой версии клиента MQ. Новые клиентские версии MQ могут подключаться к более старым менеджерам очереди MQ. Вы можете загрузить только java-версию файлов jar 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

ex: java -DMQJMS_TRACE_LEVEL=base -DMQJMS_TRACE_DIR=/tracedirectory JavaApp

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

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


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

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

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

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

sender.close(); 

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

Ответ 2

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