2017-01-16 6 views
2

Можете ли вы мне помочь, я пытаюсь найти глубину ibm mq с помощью PCFAgent по каналу SSL.Глубина IBM MQ

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, Reason 2035

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

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

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

ответ

2

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

Для MQ v7.1 или выше правило CHLAUTH по умолчанию блокирует соединение, если вы находитесь на канале «SYSTEM». Или для MQ v8.0 или выше для канала может потребоваться UserID и Password. Вам нужно посмотреть журналы событий или журналы менеджера очереди по причине 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) 
          }; 
+0

Только для канала SSL мне нужно установить UserID и пароль? Поскольку одна и та же программа работает для канала без SSL, когда я снимаю настройки безопасности и ciphersuite. Если это потому, что это канал SSL, пожалуйста, дайте мне знать, что мне нужно установить для UserID и Password здесь? – Prakash

+0

Что вы видите в менеджерах очередей AMQERR01.LOG, когда ваш клиент получает ответ 2035? – JoshMc

+0

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

1

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

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

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

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

+0

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

+0

Можете ли вы, пожалуйста, обновить вопрос с помощью записи MQ Admin, найденной в AMQERR01.LOG, это должно показать как идентификатор пользователя, лишенный разрешения, так и то, что ему не хватает. Также было бы полезно увидеть следующие команды отображения обоих каналов ssl и non-ssl: 'DIS CHL (CHL.NAME) MCAUSER' и' DIS CHLAUTH (CHL.NAME) '. Пожалуйста, дезинфицируйте информацию по своему усмотрению. Я могу обновить свой ответ более подробно о имени пользователя, которое каждый канал будет решать на основе дополнительных деталей. – JoshMc

+0

Привет, Джош, администратор говорит, что я не должен использовать сообщения PCF из-за некоторых проблем безопасности. Есть ли другой способ, которым я могу найти глубину очереди? – Prakash

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