2012-05-29 25 views
2

我想构建一个简单的消费者程序(以java为例)来获取存储在ActiveMQ主题中的所有消息。 我有一个生产者在队列中发送TextMessage。如何获取ActiveMQ中的所有入队邮件?

但我不知道如何开始写我的消费者检索旧消息,并等待新消息。

如果你有一个例子,谢谢!

这是我的制片人:http://pastebin.com/uRy9D8mY

这是我的消费者:http://pastebin.com/bZh4r66e

当我跑我的消费之前我的制片人,然后运行消费者,我什么也没得到。 当我跑我的客户随后我的制片人,我在队列中添加72个消息,但我的消费者只拿到24消息...

回答

3

我建议阅读本教程(如不阿帕奇的ActiveMQ)SUN Jms tutorial

有许多编写JMS/ActiveMQ程序的方法,使用各种框架(如Spring)或使用普通Java。

从本质上讲,写一个监听器类,像这样:

public class MyListener implements MessageListener{ 
    public void onMessage(Message message){ 
     // Read and handle message here. 
    } 
} 

既然你已经在生产消息,我假设你有连接和运行。

session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
consumer = session.createConsumer("MyQueue"); 
listener = new MyListener(); 
consumer.setMessageListener(listener); 
connection.start(); 
// At this point, messages should arrive from the queue to your listener. 

再就是不包括在这个例子中的一些错误处理代码,但你应该能够教程和JMS文档的帮助来弄明白。

+0

谢谢!我已经遵循了你的Sun jms教程,但是我遇到了两个问题:我无法接收已经入队的消息,当我等待新消息时,我只收到72条消息中的24条消息。 – kdelemme

+0

好的。我想你必须得到更多的帮助。你的设置如何,你如何消费等。 –

+0

我添加消费者和生产者代码。我使用默认conf的ActiveMQ。 – kdelemme

1

使用下面给出的代码,您可以读取队列中已排队的所有消息。

  • 在此代码while循环是无休止的循环将重复队列中的所有 的消息。
  • 一旦队列中没有消息,它将等待5秒钟,然后自动停止连接并中断 循环。

如果您需要一个无休止的使用者,每当新添加到队列中时都会读取所有消息,然后删除else部分,所以程序不会终止。

ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
    Connection con = factory.createConnection(); 
    Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    Queue queue = session.createQueue("tmp_queue2"); 
    MessageConsumer consumer = session.createConsumer(queue); 
    con.start();  
    while (true) {  
     Message msg = consumer.receive(5000); 
     if (msg instanceof TextMessage) { 
      TextMessage tm = (TextMessage) msg; 
      System.out.println(tm.getText());  
     } 
     else{ 
      System.out.println("Queue Empty"); 
      con.stop(); 
      break; 
     } 
    } 

希望这个消费计划将帮助谁是新来的ActiveMQ人。

相关问题