【发布时间】:2014-11-18 07:08:28
【问题描述】:
我们有一个使用 JMS 从 IBM Websphere 队列(7.5 版)同步读取 4MB 消息的应用程序。在某些情况下,我想丢弃队列中的消息而不读取它们。我试图弄清楚是否有一种方法可以在不读取整个 4MB 消息的情况下以编程方式执行此操作,这需要几秒钟(可能有数百条消息需要丢弃)。在没有 discard() 方法(或类似方法)的情况下,这是我尝试过的:
BytesMessage msg = (BytesMessage)queueReceiver.receiveNoWait();
bytesRead = msg.readBytes(msgBytes, 1024); // just read 1024 bytes
queueReceiver.close();
上面的代码并不比从队列中检索整个 4MB 消息更快(通过读入更大的缓冲区)。这让我相信在调用 readBytes() 之前,receiveNoWait() 调用正在将整个消息下载到内部缓冲区中。我可以提供的唯一其他信息是在会话开始时队列设置为“自动确认”:
queueSession = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
如果我将其更改为 CLIENT_ACKNOWLEDGE 并使用 msg.acknowledge() 确认消息,会产生预期的效果吗?还是我缺少什么?
感谢您的帮助, 道格
【问题讨论】:
-
在activemq中你可以只使用消息,但我不确定这是否意味着阅读消息来做到这一点。确实是个好问题。
-
您在如何将消息从服务器拉到客户端方面是非常正确的。是否有关于消息的某些内容,例如确定是否应删除消息的属性?还是其他一些标准?
-
数据库中的状态码告诉应用程序它不再需要队列中的消息(由于其他一些故障条件)。我无法清除整个队列,因为还有其他线程在处理其他消息。我只是想清除特定消息而不下载它们,而这似乎使用 JMS 是不可能的。