【问题标题】:new MQConnectionFactory() throws NullPointerException in JBoss新的 MQConnectionFactory() 在 JBoss 中抛出 NullPointerException
【发布时间】:2011-03-11 03:33:50
【问题描述】:

我正在尝试执行以下命令:

MQConnectionFactory connFactory = new MQConnectionFactory();

我得到一个似乎无法追踪的空指针异常。我在下面附上了堆栈跟踪。

java.lang.NullPointerException
  at com.ibm.msg.client.jms.internal.JmsFactoryFactoryImpl.getInstance(JmsFactoryFactoryImpl.java:169)
  at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.setProviderFactory(JmsConnectionFactoryImpl.java:165)
  at com.ibm.mq.jms.MQConnectionFactory.<init>(MQConnectionFactory.java:271)
  at com.foundation.agent.plugin.JMSClient.createConnection(JMSClient.java:154)
  at com.foundation.agent.plugin.JMSClient.launch(JMSClient.java:108)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)

我正在使用类加载器加载调用new MQConectionFactory() 的类,所以我怀疑某些 JBoss JMS 库可能导致了这种情况。

更多信息:

  • com.ibm.mq.runtime_7.0.1.0\lib

罐子:

  • com.ibm.mq.headers.jar
  • com.ibm.mqjms.jar
  • jms.jar
  • com.ibm.mq.jar
  • connector.jar
  • jta.jar
  • com.ibm.mq.jmqi.jar
  • dhbcore.jar
  • providerutil.jar
  • com.ibm.mq.pcf.jar
  • fscontext.jar

【问题讨论】:

    标签: java jboss jms ibm-mq


    【解决方案1】:

    您似乎正在使用 v7.0.1.0 的 WMQ。您是否按照v7 WMQ Using Java manual 中的说明配置了 CLASSPATH?假设标准安装,运行时 CLASSPATH 中唯一需要的 jar 是 com.ibm.mqjms.jar。标准安装中大约有 10 个 jar,我在您的列表中没有看到,所以我不确定您是否列出了 CLASSPATH 变量中的内容或 java/lib 中的内容,但这不是我所期望的列表。如果您从某个地方获取了 jar 文件,请尝试使用 full client install

    【讨论】:

    • 我没有尝试使用 XA 功能,我不确定我使用的是资源适配器,因为我没有定义或部署 EJB。基本上我在jboss中启动一个线程,它将使用连接工厂建立连接......在我看来,我可能会弄错,它导致MQConnectionfactory尝试将自己实例化为XA事务工厂我没有许可证。话虽如此,我不确定什么或如何覆盖这个......
    • 我只列出了我从 IBM/WebSphere MQ/eclipse/plugins/com.ib.mq.runtime_7.0.1.0/lib 添加的我需要的 jar,还有其他的 jar我应该包括可能导致 jboss 默认为我想要的其他东西?
    • 从 WMQ Explorer 安装中获取 jar 可能会也可能不会。 WMQ Explorer 捆绑了它需要的特定功能,并且可能使用非公共 API 调用。如果您可以让它在开发中以这种方式工作,那就去做吧。但是对于生产,我将安装完整的 WMQ 客户端,正如我的回复中链接的那样。这是 IBM 将支持的配置,包括跟踪、诊断和示例实用程序等可用于测试安装的内容。即使您不一定需要这些,如果您打开支持事件,IBM 也可能需要它们。
    • 定义连接工厂时可以选择要定义的类型。它可以是 CF、TCF、QCF、XACF、XAQCF 或 XATCF。如果您在代码中实例化对象,这取决于您在 API 调用之前设置的环境。如果您在 JNDI 中执行此操作,则取决于 JNDI 对象定义。一旦您安装了完整的客户端代码并包含了开发工具包选项,就会有带有和不带有 JNDI 查找的示例程序。
    • Rob,首先感谢您的帮助!所以我挂断了使用 JNDI,我无法通过新的 MQConnectionFactory()。使用 JNDI 将如何解决我不能新建它的事实?属性是否仍然不正确导致空指针? (如果我错了,请告诉我)另外,所以你有更多的上下文我试图运行一个客户端只是为了连接到托管 MQ 服务器的第三方,我是否真的仍然需要在任何地方进行完整安装?
    【解决方案2】:

    在第169行反编译JmsFactoryFactoryImpl的代码,可以看到上面几行有trace输出。在具有与您相同的异常的系统上,系统错误(在我的情况下为 Tomcat 的 catalina.out)上的跟踪输出显示以下内容:

          WorkQueueMananger Contents
                               --------------------------
    
    |   Maintain ThreadPool size     :-  false
    |   Maximum ThreadPool size      :-  -1
    |   ThreadPool inactive timeout  :-  0
    |   unavailable -                :-  com.ibm.msg.client.commonservices.CSIException: JMSCS0002
    

    使用该代码,您可以访问: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=%2Fcom.ibm.mq.javadoc.doc%2FWMQJMSClasses%2Ferrorcodes.html

    【讨论】:

      【解决方案3】:

      即使添加了所有必需的 JAR,我也遇到了同样的问题。最后,将我的 JDK 从 IBM JDK 更改为 Oracle/Sun JDK 后问题得到解决。看起来 IBM JDK(独立)没有足够的东西来创建连接工厂。

      【讨论】:

      • 如何查看当前使用的 JDK?我非常确定我使用的是 Oracle/Sun JDK,因为这是我经常下载的。但是有没有办法检查?
      猜你喜欢
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多