【问题标题】:jms connection factory javax.naming.NamingException: Could not create resource factory instancejms 连接工厂 javax.naming.NamingException:无法创建资源工厂实例
【发布时间】:2018-02-23 11:57:06
【问题描述】:

您好,我正在尝试从 Tomcat 8 连接 WebSphere IBM MQ 7.5.0.7 连接工厂。在启动 tomcat 服务器时,我们加载 spring XML,然后我们连接到 IBM MQ 连接工厂。

下面是spring xml中的代码

<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
            <property name="jndiName" value="java:comp/env/JMS/QFX_PF1UATMQCF" />
        </bean>

Tomcat 中 Context.xml 中的以下代码。

<Resource name="JMS/QFX_PF1UATMQCF"
        auth="Container"
        type="com.ibm.mq.jms.MQQueueConnectionFactory"
        factory="com.ibm.mq.jms.MQQueueConnectionFactoryFactory"
        description="JMS Queue Connection Factory for sending messages"
        HOST="some hostname"
        PORT="1425"
        CHAN="SYSTEM.DEF.SVRCONN"
        TRAN="1"
        QMGR="EUQFXP7A"/>   

以下是我在启动 tomcat 时遇到的异常。

 Cannot resolve reference to bean 'jmsConnectionFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jmsConnectionFactory' defined in class path resource : Invocation of init method failed; nested exception is javax.naming.NamingException: Could not create resource factory instance [Root exception is java.lang.NoClassDefFoundError: javax/jms/JMSException]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1325)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)

【问题讨论】:

    标签: spring tomcat ibm-mq jndi


    【解决方案1】:

    您至少需要将以下 JAR 文件复制到 Tomcat(例如$CATALINA_BASE/lib):

    正如@JoshMc 所说,您不应该再使用 MQ 7.5。

    在启动 Tomcat 时,您可能会在 catalina.log 中看到 WARNING 消息,如下所示:

    24-Feb-2018 22:06:40.473 WARNING [localhost-startStop-1] org.apache.tomcat.util.scan.StandardJarScanner.processURLs Failed to scan [file:.../lib/jms.jar] from classloader hierarchy
     java.io.FileNotFoundException: .../lib/jms.jar (The system cannot find the file specified)
            at java.util.zip.ZipFile.open(Native Method)
            at java.util.zip.ZipFile.<init>(ZipFile.java:219)
    

    您可以通过将 MQ jar 添加到 catalina.properties 中的 tomcat.util.scan.StandardJarScanFilter.jarsToSkip 属性来消除这些警告。

    【讨论】:

    • 几点。 1. 在 MQ v7.5 中,IBM 不支持按照您的建议从默认位置复制 jar 文件。这可能有效,但如果您需要向 IBM 开票,这将是一个支持问题。 2. v7.5 于 4 月底停止支持。 3. v8 和 v9 都允许您将 jar 文件“重新定位”到您自己组织中您喜欢的任何位置,它们也有仅包含 jar 文件的 Java-All 包,这样就不需要安装完整的 MQ如果您只需要 IBM MQ Classes for Java 和 IBM MQ Classes for JMS APIs 的 jar 文件,则不再需要客户端。
    • @JoshMc 是对的:您不应该再使用 MQ 7.5,而应该使用可重定位的 jar。我将编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2018-01-10
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多