接收队列中的消息数

时间:2012-11-28 07:56:06

标签: java activemq message-queue

我正从aActive MQ队列接收消息。

有没有办法一次收到多条消息?还是必须用循环来完成?

此外,如果我想说30个消息运行一个过程,并且只有当该过程有效时才为所有这些过程返回message.acknowledge();

我的意思是如果程序失败,我不想从队列中删除那些30个。

感谢。

2 个答案:

答案 0 :(得分:2)

你必须循环完成。通常,最好使用消息驱动的bean来消费消息,但它不适用于这种情况,因为它们按消息进行消息,而您无法指定确切的数字。因此,使用MessageConsumer和手动交易:

@Resource
UserTransaction utx;

@Resource(mappedName="jms/yourConnectionFactory");
ConnectionFactory cf;

@Resource(mappedName="jms/yourQueue");
Queue queue;

..    
Connection conn = null;
Session s = null;
MessageConsumer mc = null;
try {
    utx.begin();
    conn = cf.createConnection();
    s = conn.createSession(true, Session.CLIENT_ACKNOWLEDGE); //TRANSACTIONAL SESSION!
    mc = s.createConsumer(queue);
    conn.start(); // START CONNECTION'S DELIVERY OF INCOMING MESSAGES
    for(int i=0; i<30; i++)
    {
          Message msg = mc.receive();
          //BUSINESS LOGIC
    }
    utx.commit();
} catch(Exception ex) {
  ..
} finally { //CLOSE CONNECTION, SESSION AND MESSAGE CONSUMER
}

答案 1 :(得分:0)

我没有ActiveMQ的经验。但我认为在队列侦听器的情况下,基本逻辑应该与队列实现相同。

对于您的第一个问题,我不知道从队列中检索多条消息的任何方法。我认为最好的方法是在循环内逐个获取它。

对于第二个问题,在读取消息的基础事务提交之前,不会从队列中丢弃消息。因此,您可以在单个事务中读取大量消息,并在发生错误时将其回滚。它不应该删除队列中的任何现有消息。

我可以问为什么你需要30条消息来运行一个程序。通常当我们使用队列时,每条消息都应该能够独立处理。