4

对于以下代码

 public class JMSSamplePut 
    {
      private static String initialContextUrl = null;
      private static String connectionFactoryFromJndi = "UM_QMGR_QCF";
      private static String queueFromJndi = "BCUFXW.EXB.ATHENA.FX.IN";
      private static String outString = "A sample text message " +
                                    "from JMSSampleput";
      private static int retryInterval = 10;
      private static int retryCount = 3;
      private static int connStatus = 1;


      /**
       * @param args
       */
      public static void main( String[] args ) 
      {

        // Variables
        Queue                   ioQueue      = null;
        QueueSession            session      = null;
        QueueSender             queueSender  = null;
        QueueConnection         connection   = null;
        QueueConnectionFactory  factory      = null;
        boolean                 transacted   = false;
        int i = 0;

        try { 
          // Instantiate the initial context for JNDI
          String contextFactory ="com.sun.jndi.fscontext.RefFSContextFactory";
          Hashtable environment = new Hashtable();
          environment.put(Context.INITIAL_CONTEXT_FACTORY, contextFactory);
          environment.put(Context.PROVIDER_URL, "file:/c:/jndi"); 
          Context context = new InitialDirContext(environment);
          System.out.println("Initial context found!");

          // Create a Queue ConnectionFactory
          factory = (QueueConnectionFactory) context.lookup(connectionFactoryFromJndi);

    ...........

最后一行失败了

捕获 JMSException:com.ibm.msg.client.jms.DetailedJMSSecurityException:JMSWMQ2013:为 QueueManager 提供的安全身份验证无效,连接模式为“Client”,主机名为“NATMIB1.hostname.net(1414)”。请检查您要连接到链接异常的 QueueManager 上提供的用户名和密码是否正确:com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' (' MQRC_NOT_AUTHORIZED')。完成的

JVM参数

-Djavax.net.ssl.keystore=c://keystore//a_dev.jks \
-Djavax.net.ssl.keyStorePassword=******** \
-Djavax.net.ssl.trustStorePassword=******** \
-Djavax.net.ssl.trustStore=c://keystore//cacerts.jks \
-Djavax.net.debug=all   

任何指针?为什么是以下行?

为具有连接模式“客户端”和主机名“NATMIB1.hostname.net(1414)”的 QueueManager 提供的安全身份验证无效

看起来 JNDI 代理无法找到 QueueManager 的名称?我在 .bindings 文件中有以下行,队列管理器名称是 NATMIB1

UM_QMGR_QCF/RefAddr/3/Content=NATMIB1.xyz.net

提前致谢

桑达尔

4

2 回答 2

3

如果您拥有正确的工具,调试 WMQ 安全错误非常简单。首先,根据说明获取SupportPac MS0P并安装到 WMQ Explorer 中。如果您没有现代版本的 WMQ Explorer,您可以从SupportPac MS0T下载它。

接下来,在 QMgr 上启用授权事件并重新创建错误。

此时,在 WMQ Explorer 中右键单击事件队列并选择 Format Event Messages。这将向您显示错误的所有方面,包括:

  1. 生成错误的用户 ID。根据通道设置、退出和客户端设置,使用的 ID 可能不是您所期望的。
  2. 进行的 API 调用。在这种情况下可能是 Connect,但有时这也不是您所期望的。例如,IBM JMS 类将始终查询 QMgr 以获取 DLQ 名称,如果您未授予查询权限,则它会失败。
  3. 用于调用的确切选项。
  4. 发出调用的对象。

一旦知道了错误的这些要素,您就可以确定是不是 ID 本身、渠道、ID 的授权等问题。


更新

针对评论中的问题,要启用授权事件,请使用 MQ Explorer 或 runmqsc,如下所示:

命令行版本

对于 MQ Explorer 版本,首先右键单击 QMgr 并选择 Properties。

在此处输入图像描述

然后在导航面板中选择事件,根据需要设置事件并单击OK

在此处输入图像描述

于 2013-01-20T03:34:49.923 回答
2

在本例中,您使用文件系统上下文作为 JNDI 提供者。JMS 对象以平面文件格式存储在 c:/jndi 目录中。完成后,您可以在文本编辑器中查看此文件,虽然不是那么容易阅读,但您将能够看到对象的一些元素。顺便说一句,我建议使用 WMQ Explorer 作为这里选择的管理工具——它可以读取和更新任何 JNDI,包括文件系统上下文。

最后一行是查找名为“UM_QMGR_QCF”的对象。这只是对对象进行查找。它不会连接到 QueueManager 来执行此操作,并且连接工厂对象的创建不会创建回 QueueManager 的连接。

所看到的错误将来自 createConnection 调用。该错误意味着 createConnection 调用中提供的用户 ID/密码不匹配或未通过 QM 上设置的任何安全性进行身份验证。

该错误与 TCP/IP 链接上的 SSL 设置无关。

有关设置 WMQ 安全性的信息,您可以从这个场景开始http://publib.boulder.ibm.com/infocenter/prodconn/v1r0m0/index.jsp?topic=%2Fcom.ibm.scenarios.wmqwas101.doc%2Ftopics% 2Fscenario_overview.htm

我建议验证异常的来源——也尝试对从 JNDI 返回的对象执行 System.out.println()。所有 WMQ Admin 对象都将通过内置的 toString() 自行格式化

于 2013-01-18T13:49:12.223 回答