【问题标题】:Depth of the IBM MQIBM MQ 的深度
【发布时间】:2017-05-30 21:28:40
【问题描述】:

您能帮帮我吗,我正在尝试通过 SSL 通道使用 PCFAgent 查找 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,原因 2035

编辑以添加来自 cmets 的额外澄清细节:

MQ Admin 在应用程序接收到 2035 的同时发现了与 SYSTEM.DEFAULT.MODEL.QUEUE 相关的 AMQERR01.LOG 错误。

当我取消安全设置和密码套件时,相同的程序适用于非 SSL 通道。

【问题讨论】:

    标签: java ssl ibm-mq pcf


    【解决方案1】:

    好吧,我看不出您在代码中的何处设置了 UserID。因此,您发送的是空白 UserID,如果通道的 MCAUSER 为空白,则表示由于旧的安全漏洞,它会变为“mqm”用户ID。

    对于 MQ v7.1 或更高版本,如果您在“系统”通道上,默认的 CHLAUTH 规则将阻止连接。或者对于 MQ v8.0 或更高版本,通道可能需要用户 ID 和密码。您需要查看事件队列或队列管理器日志以了解 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)
                                };
    

    【讨论】:

    • 是否只有SSL通道需要设置UserID和Password?因为当我取消安全设置和密码套件时,相同的程序适用于非 SSL 通道。如果是因为是SSL通道,请告诉我这里需要设置什么UserID和Password?
    • 当您的客户端收到 2035 响应时,您在队列管理器 AMKERR01.LOG 中看到了什么?
    • 嗨,我无权访问这些日志。我所拥有的只是 2035 错误。
    • 您需要询问有权提供该信息的 MQ 管理员。收到 2035 错误的原因有很多,如果没有来自队列管理器 AMQERR01.LOG 的信息,您将无法判断具体原因是什么。请使用 MQ 队列管理器日志中的详细信息更新您的问题。
    • MQ 管理员说 SYSTEM.DEFAULT.MODEL.QUEUE 中存在错误。他在问我是否正在创建一个动态队列。我不确定。请帮忙。
    【解决方案2】:

    PCFAgent 类为来自命令服务器的响应消息创建一个动态队列。默认使用的模型队列是SYSTEM.DEFAULT.MODEL.QUEUE。用户需要拥有模型队列的OAM权限+get +dsp

    如果程序在连接到非 SSL 通道时可以正常工作,则连接必须解析为具有针对 SYSTEM.DEFAULT.MODEL.QUEUE 所需的 OAM 权限的不同用户 ID。

    队列管理器的AMQERR01.LOG 中的错误将显示缺少权限的用户标识以及缺少的特定权限。

    根据您使用的 MQ 客户端 jar 文件的版本,如果您未指定 UserID,MQ 客户端将发送空白 UserID 或运行 java 进程的 UserID。在队列管理器方面,如果通道的MCAUSER 属性为空白,那么如果接收到空白 UserID 或您的进程在其下运行的 UserID,它将继承 mqm。如果频道的MCAUSER 属性不为空,则表示将用于权限的 UserID。

    【讨论】:

    • 感谢您的回复。我想知道你在这里说的是什么用户?因为我们在正确的代码中传递了任何 UserId。
    • 您能否使用 MQ 管理员在 AMKERR01.LOG 中找到的条目更新问题,这应该显示缺少权限的用户 ID 以及缺少的权限。查看 ssl 和非 ssl 通道的以下显示命令也很有帮助:DIS CHL(CHL.NAME) MCAUSERDIS CHLAUTH(CHL.NAME)。请在您认为合适的情况下对信息进行消毒。我可以根据额外的详细信息,使用每个频道将解析为的用户名的更多详细信息来更新我的答案。
    • 您好 Josh,管理员说出于安全考虑,我不应该使用 PCF 消息。有没有其他方法可以找到队列深度?
    • @Prakash 这将是一个新问题,您应该根据您提出的原始问题在此处接受一个答案,并发布一个关于如何从不依赖的 MQ Java API 查找队列深度的新问题PCF 消息。
    • 当然,乔希。我去做。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多