gpt4 book ai didi

java - 如何使用 Java/JMS 从队列中丢弃消息?

转载 作者:行者123 更新时间:2023-11-30 11:14:15 25 4
gpt4 key购买 nike

我们有一个使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com