Spring Bean用于为JBoss HornetQ设置connectionFactory

时间:2014-09-22 11:20:50

标签: spring jboss jms hornetq

我正在使用一个当前输出到ActiveMQ的应用程序,并重新编写它以使用为我设置的JBoss HornetQ。该应用程序是一个独立的应用程序(不在EJB容器中运行),并使用Spring 2(尽管我已更新到Spring 3以访问'name'属性)。

我已经提到了一些例子,它们来自:

<bean name="connectionFactory" class="org.hornetq.jms.client.HornetQJMSConnectionFactory">
    <constructor-arg name="ha" value="false"/>
    <constructor-arg name="initialConnectors">
        <bean name="transportConfiguration" class="org.hornetq.api.core.TransportConfiguration">
            <constructor-arg name="className" value="org.hornetq.core.remoting.impl.netty.NettyConnectorFactory" />
            <constructor-arg name="params">
                <map key-type="java.lang.String" value-type="java.lang.Object">
                    <entry key="host" value="127.0.0.1" />
                    <entry key="port" value="5445" />
                </map>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>

使用它会产生异常

  "org.springframework.beans.factory.BeanCreationException: Error creating bean with name connectionFactory' defined in class path resource [applicationContext.xml]: Instantiation of bean     failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not     instantiate bean class [org.hornetq.jms.client.HornetQJMSConnectionFactory]: Constructor threw exception; nested exception is java.lang.NoSuchFieldError:

我正在匹配构造函数“public HornetQJMSConnectionFactory(boolean ha,org.hornetq.api.core.TransportConfiguration ... initialConnectors)”(取自我正在使用的jboss-client.jar文件中的类文件)as我可以看到。

我似乎也匹配TransportConfiguration的构造函数,它是“public TransportConfiguration(java.lang.String className,java.util.Map params)”

那么,任何人都可以在这里指出我做错了什么吗?我觉得这将是一件愚蠢的事情:)

我尝试将类型附加到所有内容上,如下所示,但仍然得到相同的东西:

<bean name="connectionFactory" class="org.hornetq.jms.client.HornetQJMSConnectionFactory">
    <constructor-arg name="ha" value="false" type="boolean"/>
    <constructor-arg name="initialConnectors" type="org.hornetq.api.core.TransportConfiguration[]">
        <bean name="transportConfiguration" class="org.hornetq.api.core.TransportConfiguration">
            <constructor-arg name="className" value="org.hornetq.core.remoting.impl.netty.NettyConnectorFactory" type="java.lang.String"/>
            <constructor-arg name="params" type="java.util.Map">
                <map key-type="java.lang.String" value-type="java.lang.Object">
                    <entry key="host" value="127.0.0.1" />
                    <entry key="port" value="5445" />
                </map>
            </constructor-arg>
        </bean>
    </constructor-arg>
</bean>

1 个答案:

答案 0 :(得分:0)

我觉得使用jndi nad只能依赖于jms(而不是hornetq)会更好。

1-在Jboss的standalone.xml中定义连接工厂:

<connection-factory name="RemoteConnectionFactory">
    <connectors>
    <connector-ref connector-name="netty"/>
    </connectors>
    <entries>
        <entry name="java:jboss/exported/jms/ConnectionFactory"/>
    </entries>
</connection-factory>

2-使用jndi:

定义连接工厂bean
<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/jboss/exported/jms/ConnectionFactory" />
    <property name="lookupOnStartup" value="false"/>
    <property name="proxyInterface" value="javax.jms.ConnectionFactory"/>
</bean>

所以你只依赖于jms-api,将来你可以随时轻松更改你的jms-broker:

<dependency>
    <groupId>javax.jms</groupId>
    <artifactId>javax.jms-api</artifactId>
    <version>2.0</version>
   <scope>provided</scope>
</dependency>