【问题标题】:tomcat jms jndi naming exceptiontomcat jms jndi命名异常
【发布时间】:2014-02-05 11:46:07
【问题描述】:

您好,我正在尝试在 tomcat 服务器中使用 jndi 实现 jms 连接器。但我得到了

javax.naming.NamingException: Cannot create resource instance  

我不是在 server.xml 文件中编写资源,而是在我的 spring 项目的 context.xml 文件中编写资源。我已经使用 DataSource 测试了以下配置并且它工作正常,但是在使用 JMS 测试它时我面临命名异常

以下是我的 jndi 配置。

context.xml

<Context crossContext="true">

    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jms/ConnectionFactory" auth="Container"
                 type="org.apache.activemq.ActiveMQConnectionFactory"
                 description="JMS Connection Factory"
                 factory="org.apache.activemq.jndi.JNDIReferenceFactory"
                 brokerURL="tcp://localhost:61616"
                 brokerName="LocalActiveMQBroker"
                 userName="admin" password="admin"
                 useEmbeddedBroker="false"
                 clientID="TomcatClientID" />

    <Resource name="jms/myQueue" auth="Container"
                 type="org.apache.activemq.command.ActiveMQQueue"
                 description="JMS Queue"
                 factory="org.apache.activemq.jndi.JNDIReferenceFactory"
                 physicalName="app.jms.queue" />
</Context>

web.xml

<resource-ref>
        <res-ref-name>jms/ConnectionFactory</res-ref-name>
        <res-type>javax.jms.ConnectionFactory</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

    <resource-ref>
        <res-ref-name>jms/myQueue</res-ref-name>
        <res-type>javax.jms.Queue</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

我的java类:-

Context envContext = new InitialContext();
 ConnectionFactory connectionFactory = (ConnectionFactory) envContext.lookup("java:/comp/env/jms/ConnectionFactory");

我在我的 tomcate_home/lib 目录中添加了以下 jar

apache-activemq-4.1.0-incubator.jar

activemq-all_5.4.jar commons-loggin.jar

我正在使用 tomcat 8 独立服务器。

【问题讨论】:

    标签: tomcat jms tomcat7 activemq jndi


    【解决方案1】:

    我之前遇到过很多麻烦(各种类加载器问题、类转换异常等)。我不确定最正确的解决方案到底是什么,但对我有用的是:

    确保我的项目的 web-inf/lib 中没有 activemq 或 jms 相关的 jar。在Tomcat的lib文件夹中,activemq-client-5.8.0.jar、geronimo-jms_1.1_spec-1.1.1.jar、geronimo-j2ee-management_1.1_spec-1.0.1.jar、geronimo-jta_1.0.1B_spec-1.0。 1.jar(确保不存在其他 jms 或 activemq 相关的 jar)。

    项目的 web.xml:

    <resource-env-ref>
      <description>
        ActiveMQ Topic Connection factory
      </description>
      <resource-env-ref-name>
        jms/flex/TopicConnectionFactory
      </resource-env-ref-name>
      <resource-env-ref-type>
        org.apache.activemq.ActiveMQConnectionFactory
      </resource-env-ref-type>
    </resource-env-ref>     
    
    <resource-env-ref>
      <description>
        ActiveMQ Topic to which a bootstrap request for a users orders are sent
      </description>
      <resource-env-ref-name>
        jms/topic
      </resource-env-ref-name>
      <resource-env-ref-type>
        org.apache.activemq.command.ActiveMQTopic
      </resource-env-ref-type>
    </resource-env-ref> 
    

    Tomcat 的 web.xml:

    <resource-ref> 
        <res-ref-name>jms/flex/TopicConnectionFactory</res-ref-name>
        <res-type>javax.jms.ConnectionFactory</res-type>
        <res-auth>Application</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>
    

    Tomcat 的 server.xml:

    <Resource name="jms/flex/TopicConnectionFactory" 
              auth="Container"
              type="org.apache.activemq.ActiveMQConnectionFactory" 
              factory="org.apache.activemq.jndi.JNDIReferenceFactory"
              brokerURL="tcp://localhost:61616"
              />
    

    Tomcat 的 context.xml:

    <ResourceLink global="jms/flex/TopicConnectionFactory" name="jms/flex/TopicConnectionFactory" type="org.apache.activemq.ActiveMQConnectionFactory"/>
    

    我必须再次强调,这只是对我有用的方法,毫无疑问,更多有经验的开发人员正在阅读这篇文章并感到畏缩,但我希望它有所帮助!

    【讨论】:

    • 嗨,马特,您使用的是哪个版本的 tomcat 和 active mq??
    • 我使用的是 activemq 5.8.0 和 Tomcat 6.0.24,所以语法对你来说可能略有不同...
    猜你喜欢
    • 2018-09-22
    • 2017-05-11
    • 2015-03-08
    • 2016-01-07
    • 1970-01-01
    • 2014-12-24
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多