Глубина IBM MQ

Не могли бы вы помочь мне, я пытаюсь найти глубину ibm mq с PCFAgent по каналу SSL.

Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
     Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
     System.setProperty("javax.net.ssl.trustStore","abc-dev.jks");
     System.setProperty("javax.net.ssl.trustStorePassword","abcdabcd");

     System.setProperty("javax.net.ssl.keyStore", "abc-dev.jks");
     System.setProperty("javax.net.ssl.keyStorePassword", "abcdabcd");

     MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_128_CBC_SHA";



    int attrs[] = { 2016, 3 };
    System.out.println("parameter creation");
    PCFParameter parameters[] = { new MQCFST(2016, "*"), new MQCFIN(20, 1),
            new MQCFIL(1002, attrs) };
    String name = null;
    Integer depth = null;
    System.out.println("parameter creation end");



    try {
        PCFAgent agent;
        if (args.length == 1) {
            System.out.print("Connecting to local queue manager " + args[0]
                    + "... ");
            agent = new PCFAgent(args[0]);
        } else {
            System.out.print("Connecting to queue manager at " + args[0]
                    + ":" + args[1] + " over channel " + args[2] + "... ");
            agent = new PCFAgent(args[0], Integer.parseInt(args[1]),
                    args[2]);
        }
        System.out.println("Connected.");
        System.out.print("Sending PCF request... ");
        com.ibm.mq.MQMessage responses[] = agent.send(13, parameters);
        System.out.println("Received reply.");
        for (int i = 0; i < responses.length; i++) {
            MQCFH cfh = new MQCFH(responses[i]);
            if (cfh.reason == 0) {
                for (int j = 0; j < cfh.parameterCount; j++) {
                    PCFParameter p = PCFParameter
                            .nextParameter(responses[i]);
                    switch (p.getParameter()) {
                    case 2016:
                        name = (String) p.getValue();
                        break;

                    case 3: // '\003'
                        depth = (Integer) p.getValue();
                        break;
                    }
                }

                System.out.println("Queue " + name + " curdepth " + depth);
            } else {
                System.out.println("PCF error:\n" + cfh);
                for (int j = 0; j < cfh.parameterCount; j++)
                    System.out.println(PCFParameter
                            .nextParameter(responses[0]));

            }
        }

        System.out.print("Disconnecting... ");
        agent.disconnect();
        System.out.println("Done.");
    } catch (ArrayIndexOutOfBoundsException abe) {
        System.out
                .println("Usage: \n\tjava ListQueueDepth queue-manager\n\tjava ListQueueDepth host port channel");
    } catch (NumberFormatException nfe) {
        System.out.println("Invalid port: " + args[1]);
        System.out
                .println("Usage: \n\tjava ListQueueDepth queue-manager\n\tjava ListQueueDepth host port channel");
    } catch (MQException mqe) {
        System.err.println(mqe);
    } catch (IOException ioe) {
        System.err.println(ioe);
    }

Когда я пытаюсь запустить эту программу удаленно, я получаю следующее исключение:

com.ibm.mq.MQException: MQJE001: код завершения 2, причина 2035

РЕДАКТИРОВАТЬ, чтобы добавить дополнительные уточняющие детали из комментариев:

Администратор MQ обнаружил ошибку в AMQERR01.LOG связанных с SYSTEM.DEFAULT.MODEL.QUEUE, в то же время приложение получает 2035.

Та же самая программа работает для канала без SSL, когда я снимаю настройки безопасности и шифр.

2 ответа

Ну, я не вижу, где вы устанавливаете UserID в коде. Поэтому вы отправляете пустой UserID, который, если MCAUSER канала пуст, означает, что он становится "mqm" UserID из-за старой дыры в безопасности.

Для MQ v7.1 или новее правило CHLAUTH по умолчанию блокирует соединение, если вы находитесь на канале "SYSTEM". Или для MQ v8.0 или выше канал может потребовать идентификатор пользователя и пароль. Вам нужно просмотреть журналы очереди событий или администратора очередей, чтобы найти причину RC 2035 (не авторизовано).

int attrs[] = { 2016, 3 };
PCFParameter parameters[] = { new MQCFST(2016, "*"),
                              new MQCFIN(20, 1),
                              new MQCFIL(1002, attrs) };

Кроме того, что с жестко закодированными значениями? Вы декомпилировали чужую программу?

Почему вы не используете поставляемые определения IBM MQ? Вот как это должно выглядеть:

int[] attrs = {
                CMQC.MQCA_Q_NAME,
                CMQC.MQIA_CURRENT_Q_DEPTH
              };
PCFParameter[] parameters = {
                               new MQCFST (CMQC.MQCA_Q_NAME, "*"),
                               new MQCFIN (CMQC.MQIA_Q_TYPE, CMQC.MQQT_LOCAL),
                               new MQCFIL (CMQCFC.MQIACF_Q_ATTRS, attrs)
                            };

PCFAgent Класс создает динамическую очередь для ответных сообщений от командного сервера. По умолчанию используется модель очереди SYSTEM.DEFAULT.MODEL.QUEUE, Пользователь должен иметь разрешение OAM +get +dsp в модельной очереди.

Если программа работает при подключении к каналу, отличному от SSL, то соединение должно разрешаться с другим идентификатором пользователя, который имеет требуемые разрешения OAM для SYSTEM.DEFAULT.MODEL.QUEUE,

Ошибка в администраторе очередей AMQERR01.LOG покажет идентификатор пользователя, в котором отсутствует разрешение (я), вместе с отсутствующим определенным разрешением (ями).

В зависимости от используемой вами версии jar-файлов MQ-клиента, если вы не укажете UserID, MQ-клиент отправит пустой UserID или UserID, под которым выполняется процесс java. На стороне администратора очередей, если MCAUSER атрибут канала является пустым, тогда он будет наследовать либо mqm, если будет получен пустой идентификатор пользователя, либо идентификатор пользователя, под которым выполняется ваш процесс. Если MCAUSER атрибут канала не является пустым, то есть UserID, который будет использоваться для разрешения.

Другие вопросы по тегам