我正在尝试为用于向ActiveMQ发送JMS消息的类编写测试。我要完成的是在被测试的类中获取一个方法,将消息发送到localhost中的ActiveMQ实例,然后在测试中选择消息并验证它是否正确。
我选择这个作为我的经纪人url:vm://localhost?broker.persistent=true
,这意味着将创建一个本地ActiveMQ实例,并将消息存储在KahaDB中(也是创建的。)(我尝试使用{{1但是,由于测试中的方法有一个broker.persistent=false
- 子句来关闭连接,因此在我检索它们之前,内存中的消息就会丢失。)
为了检索邮件并验证它,我有以下代码:
finally
我的问题是,在运行此代码时,消息不会从KahaDb中删除!在多次测试运行时,第一次添加的消息将一次又一次地被读取。我在这里遗漏了什么,或者这是KahaDB / ActiveMQ中的错误?我使用的是ActiveMQ 5.7.0。
答案 0 :(得分:2)
您已创建了一个事务会话,但从未调用过提交。在这种情况下,当调用close方法时,将回滚正在进行的事务,因此您收到的消息将被放回队列中,并将被重新传递给另一个使用者。您可以通过查询消息上的重新传递计数来测试这一点,并查看它每次都会增加。在关闭会话之前使用消息调用session.commit()
。
答案 1 :(得分:2)
尝试
final Session session =
connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
否则你会得到一个“交易”会话。
否则,如果您真的想要“交易”会话,则必须致电
// 2nd parameter is ignored, if the session is transacted
final Session session =
connection.createSession(true, -1);
// Read messages
session.commit();
messageConsumer.close();
session.close();
connection.close();
以删除您在此会话期间阅读的所有邮件。
作为您的参考,Javaworld对Transactions and redelivery in JMS有一个很好的概述。它还涵盖了其他可能性(例如,使用Session.CLIENT_ACKNOWLEDGE
单独确认消息。)