我正从aActive MQ队列接收消息。
有没有办法一次收到多条消息?还是必须用循环来完成?
此外,如果我想说30个消息运行一个过程,并且只有当该过程有效时才为所有这些过程返回message.acknowledge();
。
我的意思是如果程序失败,我不想从队列中删除那些30个。
感谢。
答案 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条消息来运行一个程序。通常当我们使用队列时,每条消息都应该能够独立处理。