【问题标题】:No clue with an exception (NullPointerException) due to a properties retrieval thrown by the IBM MQ由于 IBM MQ 抛出的属性检索,没有异常 (NullPointerException) 的线索
【发布时间】:2011-08-05 21:25:23
【问题描述】:

我遇到了我正在努力解决的 IBM MQ 引发的这个异常,我不知道为什么会发生这种情况。来了:

java.lang.NullPointerException
    at com.ibm.mq.jmqi.JmqiEnvironment.getVersionProperty(JmqiEnvironment.java:2204)
    at com.ibm.mq.jmqi.JmqiEnvironment.getProductIdentifier(JmqiEnvironment.java:2224)
    at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.initSess(RemoteConnection.java:1388)
    at com.ibm.mq.jmqi.remote.internal.system.RemoteConnection.connect(RemoteConnection.java:1078)
    at com.ibm.mq.jmqi.remote.internal.system.RemoteConnectionPool.getConnection(RemoteConnectionPool.java:338)
    at com.ibm.mq.jmqi.remote.internal.RemoteFAP.jmqiConnect(RemoteFAP.java:1488)
    at com.ibm.mq.MQSESSION.MQCONNX_j(MQSESSION.java:915)
    at com.ibm.mq.MQManagedConnectionJ11.<init>(MQManagedConnectionJ11.java:224)
    at com.ibm.mq.MQClientManagedConnectionFactoryJ11._createManagedConnection(MQClientManagedConnectionFactoryJ11.java:505)
    at com.ibm.mq.MQClientManagedConnectionFactoryJ11.createManagedConnection(MQClientManagedConnectionFactoryJ11.java:547)
    at com.ibm.mq.StoredManagedConnection.<init>(StoredManagedConnection.java:95)
    at com.ibm.mq.MQSimpleConnectionManager.allocateConnection(MQSimpleConnectionManager.java:182)
    at com.ibm.mq.MQQueueManagerFactory.obtainBaseMQQueueManager(MQQueueManagerFactory.java:869)
    at com.ibm.mq.MQQueueManagerFactory.procure(MQQueueManagerFactory.java:761)
    at com.ibm.mq.MQQueueManagerFactory.constructQueueManager(MQQueueManagerFactory.java:712)
    at com.ibm.mq.MQQueueManagerFactory.createQueueManager(MQQueueManagerFactory.java:171)
    at com.ibm.mq.MQQueueManager.(init)(MQQueueManager.java:597)
    at mytestpackage.MyTestClass.(init)(MyTestClass.java:143)
    . . .

我有两种情况,(1) 一个运行正常的独立单线程应用程序 (jre6),但是当我将它 (2) 用作 multi 使用的库的一部分时遇到了麻烦-core 环境(使用 1.4.2 JVM)。

复制代码

MQEnvironment.hostname = Host;
MQEnvironment.channel = Channel;
MQEnvironment.port = Port;
MQEnvironment.userID = QMUser;
MQEnvironment.password = QMPass;

MQQueueManager qmanager = new MQQueueManager(QueueManager);
MQMessage mqmessage = new MQMessage();
MQPutMessageOptions mqputmessageoptions = new MQPutMessageOptions();
MQQueue mqqueue = qmanager.accessQueue(QueueReq, 8208, null, null, null);

mqmessage.format = MQC.MQFMT_STRING;
mqmessage.persistence = 1;
mqmessage.replyToQueueName = QueueResp;
mqmessage.expiry = -1;
mqmessage.priority = -1;
mqmessage.writeString(MWAS);
mqmessage.messageId = "".getBytes();
mqmessage.correlationId = "".getBytes();

mqqueue.put(mqmessage, mqputmessageoptions);

mqqueue.close();

执行甚至没有到达MQQueueManager的实例化,分配MQEnvironment的静态属性时抛出异常。

额外信息

运行的操作系统是 Windows 2003 Server R2 Enterprise SP2 (x64)。 JVM 是 Sun 的 1.4.2_10 (x86)。 WMQ 版本是 7.0.1.5。 一些系统属性是: java.runtime.version=1.4.2_10-b03java.vm.vendor=Sun Microsystems Inc.os.arch=x86

最深的异常

java.lang.ExceptionInInitializerError
    at com.ibm.msg.client.commonservices.cssystem.WASSupport.<clinit>(WASSupport.java:39)
    at com.ibm.mq.internal.MQCommonServices$6.run(MQCommonServices.java:1263)
    at com.ibm.mq.internal.MQCommonServices$Helper.runIgnoresNoClass(MQCommonServices.java:1322)
    at com.ibm.mq.internal.MQCommonServices.isJmsCommonServicesRequired(MQCommonServices.java:1277)
    at com.ibm.mq.internal.MQCommonServices.<clinit>(MQCommonServices.java:265)
    at com.ibm.mq.MQSESSION.getJmqiEnv(MQSESSION.java:134)
    at com.ibm.mq.MQSimpleConnectionManager.<init>(MQSimpleConnectionManager.java:93)
    at com.ibm.mq.MQEnvironment.<clinit>(MQEnvironment.java:574)
    at mytestpackage.MyTestClass.(init)(MyTestClass.java:143)
Caused by: java.security.AccessControlException: access denied (java.util.logging.LoggingPermission control)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.util.logging.LogManager.checkAccess(LogManager.java:930)
    at java.util.logging.Logger.checkAccess(Logger.java:255)
    at java.util.logging.Logger.setLevel(Logger.java:1131)
    at com.ibm.msg.client.commonservices.j2se.trace.DefaultTracer$8.run(DefaultTracer.java:1581)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.ibm.msg.client.commonservices.j2se.trace.DefaultTracer.setTraceLevel(DefaultTracer.java:1578)
    at com.ibm.msg.client.commonservices.trace.Trace.setTraceLevel(Trace.java:408)
    at com.ibm.msg.client.commonservices.trace.Trace.initialize(Trace.java:2027)
    at com.ibm.msg.client.commonservices.trace.Trace.<clinit>(Trace.java:323)
    ... 17 more

这可能是什么?

提前谢谢你。

【问题讨论】:

  • 我们能看到一些代码吗? (就像你班的第 143 行)
  • 不能,这是机密,我什至没有。对不起。
  • 您是安装了完整的 MQ 客户端还是只是获取了 jar 文件?如果你调用 MQ 的代码是机密的,你能用一些示例代码重现问题并分享吗?
  • 我确实安装了完整的 WMQ,并安装了最后一个修订包 (7.0.1.5),我附加了复制的代码作为主要问题的编辑。
  • 我认为值得补充的是,由于类路径问题,我将所有 .jar 从安装良好的 WMQ 的 /lib 文件夹复制到 jre 的 /lib 文件夹。

标签: java multithreading thread-safety nullpointerexception ibm-mq


【解决方案1】:

“1.1.0 MS JVM”是什么意思?我可以从堆栈跟踪中看到您正在使用 v7 MQ 客户端 - 此处列出了 JVM 要求

http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg27011920

假设您是 32 位,支持的选项是

Java 2 Platform, Standard Edition (J2SE) V1.4.2 from Sun Microsystems, Inc. 
Java 2 Platform, Standard Edition V5.0 (SR1 or above) from Sun Microsystems, Inc. 
Java 2 Platform, Standard Edition V6.0 from Sun Microsystems, Inc. 
IBM 32-bit SDK for Windows, Java 2 Technology Edition, V1.4.2 
IBM 32-bit SDK for Windows, Java 2 Technology Edition, V5.0 (SR1 or above) 
IBM 32-bit SDK for Windows, Java Technology Edition, V6.0 

所以我怀疑代码抛出了 NullPointerException,因为当 WMQ Java 客户端查询系统属性时,不受支持的 JVM 意外返回 null。

【讨论】:

  • 运行的操作系统是 Windows 2003 Server R2 Enterprise SP2 (x64),但 JVM 是 Sun 的 1.4.2_10 (x86)。我附加了一些系统属性:java.runtime.version=1.4.2_10-b03java.vm.vendor=Sun Microsystems Inc.os.arch= x86.
  • 你认为它可能是什么?
  • 不确定,但我怀疑 T-Rob 的评论是相关的。堆栈跟踪的前两行表明它正在查询 WMQ 的级别(即分解“7.0.1.5”或类似的)并且由于某种原因未能获得所需的信息。如果您还没有这样做,我建议升级到最新的 fixpac 的全新安装。用几行 Java 重新创建也应该是微不足道的,因为堆栈跟踪来自基本 Java QueueManager 对象的初始化和客户端模式连接到 WMQ 的初始阶段
  • 再想一想,我怀疑它正在尝试获取存储在其中一个 .jar 文件的清单中的信息 - 您是否已解压缩 .jar、以任何方式更改标准安装,或者您是否使用会阻止您加载 .properties 文件的安全管理器设置运行?
  • strmqm,你是对的,安全管理器问题,我附加了一个我捕获的新异常。我该如何解决?
【解决方案2】:

当您尝试使用多个没有锁的线程访问数据结构 [内部不同步] 时,很可能会发生这种情况。

您在堆栈跟踪中访问的一个对象不是多线程的,您需要一个锁。

一个例子是 HashMap [针对 hashtable] - 尝试在没有外部锁的情况下将它与多个线程一起使用。

【讨论】:

  • 我在 WMQ 包装对象和 MQEnvironment.class 上同步了代码,因为它使用静态属性,但不,它一直在做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2017-02-12
相关资源
最近更新 更多