2012-09-25 42 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

相关问题