【问题标题】:MessageConsumer.receive() doesn't remove messageMessageConsumer.receive() 不删除消息
【发布时间】:2013-07-26 13:42:16
【问题描述】:

我正在尝试为用于向 ActiveMQ 发送 JMS 消息的类编写测试。我想要完成的是在被测类中获取一个方法,将消息发送到本地主机中的 ActiveMQ 实例,然后在测试中选择消息并验证它是否正确。

我选择了这个作为我的代理 url:vm://localhost?broker.persistent=true,这意味着将创建一个本地 ActiveMQ 实例,并将消息存储在 KahaDB 中(这也是创建的。)(我尝试使用 broker.persistent=false,但是由于被测方法有一个关闭连接的finally-clause,因此内存中的消息会在我检索它们之前丢失。)

为了检索消息并验证它,我有以下代码:

    //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。

【问题讨论】:

    标签: java jms activemq


    【解决方案1】:

    试试

    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 单独确认消息)。

    【讨论】:

      【解决方案2】:

      您已经创建了一个事务会话,但从未调用过提交。在这种情况下,当调用 close 方法时,正在进行的事务将回滚,因此您收到的消息将放回队列中,并将重新传递给另一个消费者。您可以通过查询消息上的重新传递计数来测试这一点,并查看它每次都增加。在关闭会话之前使用消息调用session.commit()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-29
        • 2017-06-06
        • 1970-01-01
        • 2018-06-29
        • 2014-03-21
        • 2019-03-18
        • 2021-12-16
        • 2018-11-22
        相关资源
        最近更新 更多