我正在使用一个当前输出到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>
答案 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>