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

标签 java queue jms mq

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

相关文章:

java - 是否可以从另一个应用程序(在单独的进程中启动)连接到 spring boot 嵌入式 ActiveMQ 实例?

java - 验证 spring 上下文而不刷新它

java - java中 "this"和没有 "this"之间的区别

python - Queue 的多线程支持是否在仅用于一个线程时表现出超线程?

laravel - 如何在 Laravel 或 Redis 中取消排队的作业

iphone - PerformSelectorInBackground 是否为每次调用生成新线程?

java - org.apache.activemq.broker.TransportConnection serviceTransportException 警告 : java. io.EOFException

java - 我们使用 JMS 而不是使用 REST TEMPLATE 来交换信息有什么优势?

java - Android 如何使用 Cursor 在我的直接路径中获取图像和视频缩略图?

java - 无法弄清楚为什么 Intent 没有被传递回先前的 Activity