Java MessageConsumer.receive()不';不要删除消息
我正在尝试为用于向ActiveMQ发送JMS消息的类编写测试。我试图完成的是在被测试的类中获得一个方法,将消息发送到localhost中的ActiveMQ实例,然后在测试中提取消息并验证它是否正确 我已选择此作为我的代理url:Java MessageConsumer.receive()不';不要删除消息,java,jms,activemq,Java,Jms,Activemq,我正在尝试为用于向ActiveMQ发送JMS消息的类编写测试。我试图完成的是在被测试的类中获得一个方法,将消息发送到localhost中的ActiveMQ实例,然后在测试中提取消息并验证它是否正确 我已选择此作为我的代理url:vm://localhost?broker.persistent=true,这意味着将创建一个本地ActiveMQ实例,并将消息存储在一个KahaDB中(该实例也已创建)(我尝试使用broker.persistent=false,但是由于测试中的方法有一个关闭连接的fin
vm://localhost?broker.persistent=true
,这意味着将创建一个本地ActiveMQ实例,并将消息存储在一个KahaDB中(该实例也已创建)(我尝试使用broker.persistent=false
,但是由于测试中的方法有一个关闭连接的finally
-子句,内存中的消息在我检索它们之前就会丢失。)
为了检索消息并验证它,我有以下代码:
//call method under test to send a message
//create a ConnectionFactory with url vm://localhost?broker.persistent=true
final Connection connection = connectionFactory.createConnection();
connection.start();
final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
final Destination dest = session.createQueue("my.queue");
final MessageConsumer messageConsumer = session.createConsumer(dest);
Message message = messageConsumer.receive(1000);
messageConsumer.close();
session.close();
connection.close();
我的问题是,在运行此代码时,消息不会从KahaDb中删除!在多次测试运行时,第一次添加的消息将被反复读取。我是否遗漏了一些内容,或者这是KahaDb/ActiveMQ中的一个错误?我使用的是ActiveMQ 5.7.0。您已经创建了一个事务会话,但从未在这里调用commits调用close方法时,正在进行的事务将回滚,因此您收到的消息将被放回队列中,并将重新传递给另一个使用者。您可以通过查询消息的重新传递计数来测试这一点,并查看它是否每次都增加。要使用消息,请调用
session.commit()
关闭会话之前。您已经创建了一个事务性会话,但从未调用过提交。在这种情况下,当调用close方法时,会回滚正在进行的事务,因此您收到的消息会被放回队列,并将重新发送给另一个使用者。您可以通过查询重新发送来测试这一点d对消息进行计数,并查看它是否每次都增加。要使用消息,请在关闭会话之前调用session.commit()
。尝试
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提供了一个极好的概述。它还介绍了其他可能性(例如,使用
会话.CLIENT\u ACKNOWLEDGE
单独确认消息)。试试看
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提供了一个关于的优秀概述。它还介绍了其他可能性(例如,使用
Session.CLIENT\u ACKNOWLEDGE
单独确认消息)