spring - JNDI 不适用于 HornetQ 和 tomcat

标签 spring tomcat jms jndi hornetq

我正在尝试在 tomcat 上使用 hornetq 运行 JMS 应用程序!我尝试遵循 this article 。我将 jndi.properties 放在我的客户端类路径中; jndi.属性:

java.naming.factory.initial=org.apache.naming.java.javaURLContextFactory 
java.naming.factory.url.pkgs=org.apache.naming

我将这些依赖项添加到 pom.xml 中:

<dependency> 
    <groupId>tomcat</groupId> 
    <artifactId>naming-factory</artifactId> 
    <version>5.5.23</version> 
    <scope>test</scope> 
</dependency> 
<dependency> 
     <groupId>tomcat</groupId> 
     <artifactId>naming-resources</artifactId> 
     <version>5.5.23</version> 
     <scope>test</scope> 
 </dependency>

我的 JMS spring beans:

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
        <property name="environment">
            <props>
                <prop key="java.naming.factory.initial">org.apache.naming.java.javaURLContextFactory</prop>
                <prop key="java.naming.factory.url.pkgs">org.apache.naming</prop>
            </props>
        </property>
    </bean>

<!-- Connection Factory -->
<bean id="hornetqConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="jndiName" value="/ConnectionFactory" />
</bean>

<!-- Destinations -->
<bean id="annotationDeleteCommandDestination" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiTemplate" ref="jndiTemplate"/>
    <property name="jndiName" value="/queue/command/annotation/deleteQueue" />
</bean>

我正在使用 HornetQ 默认服务器(独立、非集群)

hornetq-jms.xml:

<queue name="annotationDeleteCommandQueue">
    <entry name="/queue/command/annotation/deleteQueue"/>
</queue>

<connection-factory name="NettyConnectionFactory">
      <xa>false</xa>
      <connectors>
         <connector-ref connector-name="netty"/>
      </connectors>
      <entries>
         <entry name="/ConnectionFactory"/>
      </entries>
   </connection-factory>

但是当我启动 tomcat 时出现此错误:

 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hornetqConnectionFactory' defined in ServletContext resource [/WEB-INF/classes/config/spring/applicationContext-jms.xml]: 
Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name ConnectionFactory is not bound in this Context .........

出了什么问题? 我应该将任何 jar 文件放入 tomcat 类路径中吗? (哪个 jar ?) 我应该将队列和连接工厂定义放在 tomcat 配置中吗? (如何?) 我可以在 tomcat 中禁用 JNDI 并使用 hornetq 独立 JNDI 代替吗?

最佳答案

我通过修改jndiTemplate(使用jboss命名)并将jnp-client.jar添加到客户端类路径解决了这个问题:

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
            <prop key="java.naming.factory.url.pkgs">org.jboss.naming:org.jnp.interfaces</prop>
            <prop key="java.naming.provider.url">jnp://localhost:1099</prop>
        </props>
    </property>
</bean>

关于spring - JNDI 不适用于 HornetQ 和 tomcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13049736/

相关文章:

java - 从外部覆盖 Spring 项目的配置

java - 露天tomcat没有开始

存储驱动器中的 Tomcat

java - activemq - 等待所有消息被消费

java - 通过 MOM 在 WAS 集群内传播配置

java - Spring @Scheduled 任务运行两次

java - 我如何在 spring mvc 中使用我的 Controller ?

java - 我使用的是 JPA API 还是 Hibernate API?

java - 如何在 SSL 配置的 tomcat 中缓存和更新 CRL(证书撤销列表)/OCSP 响应?

Java:将消息发送到具有多个线程的 JMS 队列