2012-09-25 39 views
1

我想運行一個非常基本的應用程序來學習Spring JMS + ActiveMQ。我看到我的Producer創建了消息(sysout),但沒有在我的Consumer中顯示,也沒有拋出異常。我想我在這裏錯過了一些簡單的東西;非常感謝任何幫助。一個隊列的Spring JMS配置消費者

[EDITED,下面的代碼工作]

製片:

@Component 
public class JmsMessageProducer 
{ 
    @Autowired 
    private JmsTemplate template; 

    public void generateMessages() throws JMSException 
    { 
     template.send(new MessageCreator() 
     { 
      public Message createMessage(Session session) throws JMSException 
      { 
       System.out.println("sending.."); 
       TextMessage message = session.createTextMessage("this is a Producer created message!"); 
       return message; 
      } 
     }); 
    } 
} 

消費者:

@Component 
public class JmsMessageConsumer implements MessageListener { 
    @Override 
    public void onMessage(Message message) { 
     if (message instanceof TextMessage) { 
      TextMessage tm = (TextMessage) message; 
      try { 
       System.out.println("CONSUMER - received ["+tm.getText()+"]"); 
      } 
      catch (Throwable th) { 
       th.printStackTrace(); 
      } 
     } 
    } 
} 

生產者配置:

<context:component-scan base-package="mrpomario.springcore.jms"/> <!-- finds the JmsMessageProducer --> 

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="tcp://localhost:8082"/> 
</bean> 

<bean id="pomarioQueue" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg value="mrpomario.springcore.jms.queue"/> 
</bean> 

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

使用者配置:

<jms:listener-container> 
    <jms:listener ref="jmsMessageConsumer" method="onMessage" destination="mrpomario.springcore.jms.queue"/> 
</jms:listener-container> 

<bean id="pomarioQueue" class="org.apache.activemq.command.ActiveMQQueue"> 
    <constructor-arg value="mrpomario.springcore.jms.queue"/> 
</bean> 

<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="tcp://localhost:8082"/> 
</bean> 

<amq:broker id="broker" useJmx="false" persistent="false"> 
    <amq:transportConnectors> 
     <amq:transportConnector uri="tcp://localhost:8082" /> 
    </amq:transportConnectors> 
</amq:broker> 

測試用例:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:mrpomario/springcore/jms/jms-config.xml") 
public class JmsTest 
{ 
    @Autowired 
    JmsMessageProducer jmsMessageProducer; 

    @Test 
    public void test_Single_Queue_Producer_and_Consumer_Unidirectional() throws JMSException 
    { 
     try 
     { 
      jmsMessageProducer.generateMessages(); 
      assertTrue(true); 
     } 
     catch (Throwable th) 
     { 
      System.out.println("\n\nJmsTest: remote invocation failed. Ensure the web server is running.\n\n"); 
     } 
    } 
} 

我運行一個Java EE容器內的生產者(MVN碼頭:運行)其中一個Spring MVC應用程序也運行。

回答

0

我想你結束了發送和從兩個完全不同的經紀公司(以及隨後不同的隊列)消費:

只在一個地方定義了你的經紀人,說你的製片配置:

<amq:broker id="broker" useJmx="false" persistent="false"> 
    <amq:transportConnectors> 
     <amq:transportConnector uri="tcp://localhost:8082" /> 
     <amq:transportConnector uri="vm://localhost" /> 
    </amq:transportConnectors> 
</amq:broker> 

<amq:connectionFactory id="jmsFactory" brokerURL="vm://localhost" /> 

從您的消費配置中刪除代理配置,並具有唯一的connectionFactory的: 或者(如果你是在同一個VM):

<amq:connectionFactory id="jmsFactory" brokerURL="vm://localhost" /> 

或(如果是遠程):

<amq:connectionFactory id="jmsFactory" brokerURL="tcp://localhost:8082" /> 
+0

嗨Biju,非常感謝您的反饋!我嘗試了一個遵循官方Spring教程的新配置佈局,但仍然無法使其工作(不調用消費者)。您是否請審查並給我反饋? – Pomario

+0

看起來不錯,你可以確認你是否在同一個虛擬機上運行生產者和消費者.. –

+0

是,都運行在同一個虛擬機。生產者使用JUnit運行,消費者在嵌入式Jetty服務器中運行(從mvn jetty:run開始)。這個配置佈局會給我造成麻煩嗎? – Pomario

相關問題