使用Tomcat 7和嵌入式HornetQ进行JNDI访问

时间:2014-01-05 11:46:56

标签: spring tomcat jndi hornetq

我使用Tomcat 7.0和嵌入式HornetQ JMS服务器建立了一个新项目。 我使用这两个教程来帮助我:

但正如tutos中提到的那样,Tomcat JNDI存储库是只读的(无法找到写入方式)并且我配置了HornetQ使用的“分离”JNDI,消息传递可以工作,但是Tomcat无法访问它。

通常,在我使用Tomcat的其他项目中,我将数据源定义为server.xml中的全局资源,并将其映射到context.xml中。这样做,数据源的定义(jdbc url,凭证等...)在应用程序之外,可以通过环境(dev,test,prod,...)进行管理,但我无法找到方法另一个JNDI。

目前,数据源是在我的应用程序中使用参数的外部属性文件定义的,但我对此解决方案并不满意。

这是我的Spring配置:                        

<!-- enable autowire -->
<context:annotation-config />

<!-- enable transaction demarcation with annotations -->
<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
    <property name="driverClassName" value="com.informix.jdbc.IfxDriver" />
    <property name="url" value="${URL}" />
    <property name="username" value="${user}" />
    <property name="password" value="${password}" />

    <property name="maxActive" value="50" />
    <property name="maxIdle" value="10" />
    <property name="maxWait" value="1000" />
    <property name="removeAbandoned" value="true" />
    <property name="removeAbandonedTimeout" value="300" />
    <property name="logAbandoned" value="true" />
</bean>

<!-- HornetQ config -->
<bean name="namingServerImpl" class="org.jnp.server.NamingBeanImpl" init-method= "start" destroy-method="stop" >
<!-- configure HornetQ JNDI server not to use an existing JNDI service if available -->
    <property name="useGlobalService" value="false" />
</bean>

<bean name="namingServer" class="org.jnp.server.Main" init-method="start" destroy-method="stop">
    <property name="namingInfo" ref="namingServerImpl" />
    <property name="port" value="1099" />
    <property name="bindAddress" value="localhost" />
    <property name="rmiPort" value="1098" />
    <property name="rmiBindAddress" value="localhost" />
</bean>

<bean name="mbeanServer" class="java.lang.management.ManagementFactory" factory-method="getPlatformMBeanServer" />

<bean name="fileConfiguration" class="org.hornetq.core.config.impl.FileConfiguration"
    init-method="start" destroy-method="stop" />

<bean name="hornetQSecurityManagerImpl" class="org.hornetq.spi.core.security.HornetQSecurityManagerImpl" />

<!-- The core server -->
<bean name="hornetQServerImpl" class="org.hornetq.core.server.impl.HornetQServerImpl">
    <constructor-arg index="0" ref="fileConfiguration" />
    <constructor-arg index="1" ref="mbeanServer" />
    <constructor-arg index="2" ref="hornetQSecurityManagerImpl" />
</bean>

<!-- The JMS server -->
<bean name="jmsServerManagerImpl" class="org.hornetq.jms.server.impl.JMSServerManagerImpl"
    init-method="start" destroy-method="stop" depends-on="namingServer">
    <constructor-arg ref="hornetQServerImpl" />
</bean>

<!-- to use HornetQ messaging service through Spring we can either create a connection factory, or lookup one from JNDI -->
<bean name="connectionFactory" class="org.hornetq.jms.client.HornetQConnectionFactory">
    <constructor-arg index="0" type="boolean" value="false"/>
    <constructor-arg index="1">
        <bean class="org.hornetq.api.core.TransportConfiguration">
            <constructor-arg index="0" type="java.lang.String" value="org.hornetq.integration.transports.netty.NettyConnectorFactory" />
            <constructor-arg index="1">
                <map key-type="java.lang.String" value-type="java.lang.Object">
                    <entry key="port" value="5445"></entry>
                </map>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>


<bean id="notificationsQueue" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="jmsServerManagerImpl">
 <property name="jndiName">
  <value>/queue/Notifications</value>
 </property>
</bean>

<bean id="inVMConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="jmsServerManagerImpl">
 <property name="jndiName">
  <value>/ConnectionFactory</value>
 </property>
</bean> 

我怎样才能以更好的方式管理它,我的意思是,像往常一样在服务器端定义数据源?是否有配置告诉Tomcat使用我定义的外部JNDI或创建读/写仓库?

0 个答案:

没有答案