tomcat jms jndi命名异常

时间:2014-01-16 14:06:46

标签: tomcat jms tomcat7 activemq jndi

您好我正在尝试使用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 公地loggin.jar

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

1 个答案:

答案 0 :(得分:0)

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

确保我的项目的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相关的罐子。)

项目的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"/>

我必须再次强调,这只是对我有用的东西,毫无疑问,更有经验的开发人员正在阅读这篇文章并且正在努力,但我希望它有所帮助!