1

我们正在使用 Oracle JMS API 从高级队列中读取消息。我们使用以下代码从队列中读取消息:

    MessageConsumer consumer = sess.createConsumer(q);


    for (Message m; (m = consumer.receive()) != null;) 
    {
          new Timer().schedule(new QueueExample(m), 0);
    }

问题是,从队列中接收到消息后,它并没有完全从队列表中删除,只是将状态字段从 0 更改为 2。这是 Oracle JMS 客户端的默认行为吗?在使用 consumer.receive() 方法从队列中读取消息后,我们希望从队列表中完全删除记录。什么是合适的api方法来做到这一点?

4

1 回答 1

3

我认为您遇到这种情况是因为retention_time您的队列上的参数被配置为某个高值。

保留用于:

用户可以指定消息在消费后保留。系统管理员可以指定保留消息的持续时间。Oracle AQ 存储有关每条消息的历史记录的信息,保留发送给本地或远程收件人的消息的延迟、到期和保留的队列和消息属性。该信息包含 ENQUEUE/DEQUEUE 时间和执行每个请求的事务的标识。这允许用户保留相关消息的历史记录。历史可用于跟踪、数据仓库和数据挖掘操​​作。

您可以通过检查队列创建脚本并通过管理界面或使用更改设置来验证这一点ALTER_QUEUE

于 2015-10-21T11:02:47.067 回答