我们有一个使用 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 消息快(通过读入更大的缓冲区)。这让我相信 receiveNoWait() 调用是在调用 readBytes() 之前将整个消息下载到内部缓冲区中。我可以提供的唯一其他信息是在 session 启动时将队列设置为“自动确认”:
queueSession = queueConnection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
如果我将其更改为 CLIENT_ACKNOWLEDGE 并使用 msg.acknowledge() 确认消息,是否会产生预期的效果?还是我遗漏了什么?
感谢您的帮助, 道格
最佳答案
没有其他办法,必须使用消息才能将其从队列中移除。
从 AUTO_ACKNOWLEDGE 更改为 CLIENT_ACKNOWLEDGE 不会有任何区别,因为确认是告诉消息提供者从队列中删除消息的方式。 AUTO_ACKNOWLEDGE 选项告诉 JMS 客户端自动向提供者发送确认以删除消息,而应用程序使用 CLIENT_ACKNOWLEDGE 明确告诉提供者删除消息。
您可以考虑为您不打算使用的消息设置到期时间。设置了到期时间的消息在到期时间结束后将无法发送。通读消息的 JMSExpiration 属性。
关于java - 如何使用 Java/JMS 从队列中丢弃消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26005902/