Java MessageConsumer.receive()不';不要删除消息

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

我正在尝试为用于向ActiveMQ发送JMS消息的类编写测试。我试图完成的是在被测试的类中获得一个方法,将消息发送到localhost中的ActiveMQ实例,然后在测试中提取消息并验证它是否正确

我已选择此作为我的代理url:
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
单独确认消息)