Spring Bean для настройки соединения Factory с JBoss 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, который я использую), насколько я можно увидеть.
Я также, кажется, соответствую конструктору для 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 ответ
Я думаю, что лучше использовать JNDI NAD зависит только от JMS (не Hornetq).
1- Определите фабрику соединений в standalone.xml в Jboss:
<connection-factory name="RemoteConnectionFactory">
<connectors>
<connector-ref connector-name="netty"/>
</connectors>
<entries>
<entry name="java:jboss/exported/jms/ConnectionFactory"/>
</entries>
</connection-factory>
2- Определите bean-компонент фабрики соединений с помощью jndi:
<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-брокера, когда захотите:
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>