2016-08-24 63 views
0

有一個基於Spring 3.0.5框架運行的應用程序JBoss 5.1服務器如何使用Spring 3.05和JBoss 5.1(JBossMQ)實現JMS本地隊列?

我試圖按照這種tutorial,但它使用的的ActiveMQ經紀人,而不是的JBossMQ(默認的JBoss 5.1經紀人)。

我已經設置了一個名爲myQueue中在JBoss中配置(目的地 - service.xml中)隊列:

<mbean code="org.jboss.jms.server.destination.QueueService" 
    name="jboss.messaging.destination:service=Queue,name=MyQueue" 
    xmbean-dd="xmdesc/Queue-xmbean.xml"> 
    <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends> 
    <depends>jboss.messaging:service=PostOffice</depends> 

下面你可以看到我的配置的其餘部分。我錯過了什麼?我如何指定隊列和連接工廠的JNDI名稱?那麼服務器地址([ConnectionFactory] ​​Connector bisocket:// localhost:4457)呢?

我在applicationContext.xml的配置情況如下:

<bean id="connectionFactory" class="org.jboss.jms.server.connectionfactory.ConnectionFactory" /> 

<bean id="messageDestination" class="javax.jms.Queue" /> 

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
    <property name="receiveTimeout" value="10000" /> 
</bean> 

<bean id="springJmsProducer" class="myPackage.QueueProducer"> 
    <property name="destination" ref="messageDestination" /> 
    <property name="jmsTemplate" ref="jmsTemplate" /> 
</bean> 

<bean id="messageListener" class="myPackage.QueueConsumer" /> 

我的製片人


public class QueueProducer { 

    private JmsTemplate jmsTemplate; 

    private Queue queue; 

    public void setConnectionFactory(ConnectionFactory cf) { 
     this.jmsTemplate = new JmsTemplate(cf); 
    } 

    public void setQueue(Queue queue) {  
     this.queue = queue; 
    } 

    public void send(Object object) { 
     this.jmsTemplate.send(this.queue, new MessageCreator() { 
      public Message createMessage(Session session) throws JMSException { 
       return session.createTextMessage("my text to send"); 
      } 
     }); 
    } 
} 

我的消費




public class QueueConsumer implements MessageListener { 

    @Override 
    public void onMessage(Message message) { 
     if (message instanceof TextMessage) { 
      try { 
       System.out.println(((TextMessage) message).getText()); 
      }catch (JMSException ex) { 
       throw new RuntimeException(ex); 
      } 
     } 
     else { 
      throw new IllegalArgumentException("Message must be of type TextMessage"); 
     } 

    } 
} 

回答

1

你需要的是最可能是jndiTemplate。另外,你並沒有正確地將jmsTemplate beans連接在一起。以下是您在Spring應用程序上下文中需要的部分解釋。

你需要安裝一個jndiTemplate注入了JBoss JNDI實現:

<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"> 
    <property name="environment"> 
     <props> 
      <prop key="java.naming.factory.initial"> 
       org.jnp.interfaces.NamingContextFactory 
      </prop> 
      <prop key="java.naming.provider.url"> 
       jnp://localhost:1099 
      </prop> 
      <prop key="java.naming.factory.url.pkgs"> 
       org.jboss.naming:org.jnp.interfaces 
      </prop> 
     </props> 
    </property> 
</bean> 

然後,配置的ConnectionFactory在上述JNDI配置指向:

<!-- spring JMS definition --> 
<bean name="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jndiTemplate"/> 
    <property name="jndiName" value="ConnectionFactory" /> 
</bean> 

配置的事務管理器與上述ConnectionFactory:

<bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager"> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
</bean> 

將destinat關聯離子與jndiTemplate和jndiName:

<!-- jms destination already defined in jboss --> 
<bean name="myQueue" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jndiTemplate"/> 
    <property name="jndiName" value="queue/MyQueue" /> 
</bean> 

最後,配置JmsTemplate本身在連接工廠以點帶面,你就可以在你的代碼中使用JmsTemplate的:

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
</bean> 

您還需要一個消息偵聽器容器配置來運行您的使用者。將「jmsexample.ExampleListener」替換爲包含MessageListener的類的名稱:

<!-- this is the Message Driven POJO (MDP) --> 
<bean id="messageListener" class="jmsexample.ExampleListener" /> 

<!-- and this is the message listener container --> 
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="connectionFactory"/> 
    <property name="destination" ref="myQueue"/> 
    <property name="messageListener" ref="messageListener" /> 
</bean>