2013-07-16 63 views
0

我想創建一個示例JMS應用程序。我希望它做的就是啓動,並讓數據發送到端點時,生產者向消費者發送消息。Spring JMS與JBoss 7.11(HornetQ)

我遇到了麻煩,我的彈簧配置,我不知道什麼依賴我需要引入(和什麼版本)與Maven。我從一個簡單的Roo項目開始。

首先,我的spring xml看起來不錯,其次,我的maven依賴關係是否正確?從我得到的錯誤中,我認爲我已經從Maven中引入了過時的依賴關係。我還爲我的jboss配置添加了一個guest用戶/角色。

這裏是我的Spring XML的相關章節:

<bean id="jnditemplate" class="org.springframework.jndi.JndiTemplate"> 
    <property name="environment"> 
     <props> 
      <prop key="java.naming.factory.initial">org.jboss.naming.remote.client.InitialContextFactory</prop> 
      <prop key="java.naming.provider.url">remote://127.0.0.1:4447</prop> 
      <prop key="java.naming.security.principal">guest</prop> 
      <prop key="java.naming.security.credentials">password1</prop> 
     </props> 
    </property> 
</bean> 
<bean id="connectionfactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jnditemplate"/> 
    <property name="jndiName" value="jms/RemoteConnectionFactory"/> 
</bean> 
<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jnditemplate"/> 
    <property name="jndiName" value="jms/queue/test"/> 
</bean> 
<bean id="credentialsconnectionfactory" 
     class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"> 
    <property name="targetConnectionFactory" ref="connectionfactory"/> 
    <property name="username" value="guest"/> 
    <property name="password" value="password1"/> 
</bean> 
<bean id="jmstemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="credentialsconnectionfactory"/> 
    <property name="defaultDestination" ref="destination"/> 
</bean> 
<bean class="org.springframework.jms.listener.SimpleMessageListenerContainer"> 
    <property name="connectionFactory" ref="credentialsconnectionfactory"/> 
    <property name="destination" ref="destination"/> 
    <property name="messageListener" ref="receiver"/> 
</bean> 
<bean id="sender" class="com.example.web.Producer"> 
    <property name="jmsTemplate" ref="jmstemplate"/> 
</bean> 
<bean id="receiver" class="com.example.web.Consumer"/> 

這裏是我的POM的相關章節:

 <spring.version>3.2.0.RELEASE</spring.version> 
    <hornetq.client.version>2.3.0.Final</hornetq.client.version> 
... 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jms</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.jboss.as</groupId> 
     <artifactId>jboss-as-ejb-client-bom</artifactId> 
     <version>7.1.1.Final</version> 
     <type>pom</type> 
    </dependency> 
    <dependency> 
     <groupId>org.hornetq</groupId> 
     <artifactId>hornetq-core-client</artifactId> 
     <version>${hornetq.client.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hornetq</groupId> 
     <artifactId>hornetq-jms-client</artifactId> 
     <version>${hornetq.client.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss</groupId> 
     <artifactId>jboss-ejb-client</artifactId> 
     <version>1.0.5.Final</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.ejb3</groupId> 
     <artifactId>jboss-ejb3-ext-api</artifactId> 
     <version>2.0.0-beta-2</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.netty</groupId> 
     <artifactId>netty</artifactId> 
     <version>3.2.9.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hornetq</groupId> 
     <artifactId>hornetq-core</artifactId> 
     <version>2.0.0.GA</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hornetq</groupId> 
     <artifactId>hornetq-jms</artifactId> 
     <version>2.0.0.GA</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hornetq</groupId> 
     <artifactId>hornetq-logging</artifactId> 
     <version>2.0.0.GA</version> 
     <scope>compile</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.hornetq</groupId> 
     <artifactId>hornetq-transports</artifactId> 
     <version>2.0.0.GA</version> 
     <scope>compile</scope> 
    </dependency> 

而且我的JBoss standalone.xml的相關章節:

<subsystem xmlns="urn:jboss:domain:messaging:1.1"> 
     <hornetq-server> 
      <persistence-enabled>true</persistence-enabled> 
      <journal-file-size>10240</journal-file-size> 
      <journal-min-files>2</journal-min-files> 

      <connectors> 
       <netty-connector name="netty" socket-binding="messaging"/> 
       <netty-connector name="netty-throughput" socket-binding="messaging-throughput"> 
        <param key="batch-delay" value="50"/> 
       </netty-connector> 
       <in-vm-connector name="in-vm" server-id="0"/> 
      </connectors> 

      <acceptors> 
       <netty-acceptor name="netty" socket-binding="messaging"/> 
       <netty-acceptor name="netty-throughput" socket-binding="messaging-throughput"> 
        <param key="batch-delay" value="50"/> 
        <param key="direct-deliver" value="false"/> 
       </netty-acceptor> 
       <in-vm-acceptor name="in-vm" server-id="0"/> 
      </acceptors> 

      <security-settings> 
       <security-setting match="#"> 
        <permission type="send" roles="guest"/> 
        <permission type="consume" roles="guest"/> 
        <permission type="createNonDurableQueue" roles="guest"/> 
        <permission type="deleteNonDurableQueue" roles="guest"/> 
       </security-setting> 
      </security-settings> 

      <address-settings> 
       <address-setting match="#"> 
        <dead-letter-address>jms.queue.DLQ</dead-letter-address> 
        <expiry-address>jms.queue.ExpiryQueue</expiry-address> 
        <redelivery-delay>0</redelivery-delay> 
        <max-size-bytes>10485760</max-size-bytes> 
        <address-full-policy>BLOCK</address-full-policy> 
        <message-counter-history-day-limit>10</message-counter-history-day-limit> 
       </address-setting> 
      </address-settings> 

      <jms-connection-factories> 
       <connection-factory name="InVmConnectionFactory"> 
        <connectors> 
         <connector-ref connector-name="in-vm"/> 
        </connectors> 
        <entries> 
         <entry name="java:/ConnectionFactory"/> 
        </entries> 
       </connection-factory> 
       <connection-factory name="RemoteConnectionFactory"> 
        <connectors> 
         <connector-ref connector-name="netty"/> 
        </connectors> 
        <entries> 
         <entry name="RemoteConnectionFactory"/> 
         <entry name="java:jboss/exported/jms/RemoteConnectionFactory"/> 
        </entries> 
       </connection-factory> 
       <pooled-connection-factory name="hornetq-ra"> 
        <transaction mode="xa"/> 
        <connectors> 
         <connector-ref connector-name="in-vm"/> 
        </connectors> 
        <entries> 
         <entry name="java:/JmsXA"/> 
        </entries> 
       </pooled-connection-factory> 
      </jms-connection-factories> 

      <jms-destinations> 
       <jms-queue name="testQueue"> 
        <entry name="queue/test"/> 
         <entry name="java:/queue/test"/> 
        <entry name="java:jboss/exported/jms/queue/test"/> 
       </jms-queue> 
       <jms-queue name="DemoQueue"> 
        <entry name="/queue/DemoQueue"/> 
       </jms-queue> 
       <jms-topic name="testTopic"> 
        <entry name="topic/test"/> 
        <entry name="java:jboss/exported/jms/topic/test"/> 
       </jms-topic> 
      </jms-destinations> 
     </hornetq-server> 
    </subsystem> 
    <subsystem xmlns="urn:jboss:domain:weld:1.0"/> 
</profile> 

和我在嘗試通過eclipse/vmware啓動時收到的錯誤vFabric

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jms.listener.SimpleMessageListenerContainer#0' defined in ServletContext resource [/WEB-INF/spring/webmvc-config.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.hornetq.utils.HornetQThreadFactory.<init>(Ljava/lang/String;Z)V 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1486) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 

回答

2

pom.xml中至少有一些依賴項是錯誤的。查看hornetq-logging,hornetq-transports,hornetq-jms等的底部。這些在2.3.X版本中不再存在,應該刪除。

通常,如果您有HornetQ主項目中的任何JAR,它應該使用相同的版本。使用2.0.0.GA刪除所有這些罐子。其中一些已重新命名,無論哪種情況,您都應該嘗試僅使用相同版本的org.hornetq JAR。如果你的pom是2.3.0-Final。順便說一句,最新版本是2.3.2-Final,你應該升級到該恕我直言。

IIRC hornetq-jms分爲hornetq-jms-serverhornetq-jms-client。你可能想要hornetq-jms-client。核心也分爲hornetq-core-clienthornetq-server

在版本號2.3.2.Final這裏搜索JARs https://repository.jboss.org/nexus/index.html#nexus-search;quick~org.hornetq(做一些更高級的搜索)。