我们有一个应用程序使用JMS从IBM Websphere队列(版本7.5)同步读取4MB消息。在某些情况下,我想丢弃队列中的消息而不读取它们。我试图找出是否有一种方法可以在不读取整个4MB消息的情况下以编程方式执行此操作,这需要几秒钟的时间(可能有数百条消息需要丢弃)。在丢弃()方法(或类似)的由于缺少,这里是我曾尝试:(通过读取到一个更大的缓冲如何使用Java/JMS丢弃队列中的消息?
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和acknowlege使用msg.acknowledge消息()会有理想的效果吗?还是有什么我失踪?
感谢您的帮助, 道格
in activemq你可以直接使用这个消息,但我不确定这是否意味着读取消息来做到这一点。确实很好的问题。 – Leo 2014-09-23 22:54:09
消息从服务器到客户端的传输方式非常正确。是否有关于消息的某些内容,如确定是否应该删除消息的属性?或者是否有其他标准? – Calanais 2014-09-24 06:38:47
数据库中的状态码告诉应用程序不再需要队列中的消息(由于其他故障情况)。我无法清除整个队列,因为还有其他线程正在处理其他消息。我只是想清除特定的消息而不下载它们,而这似乎不可能使用JMS。 – Doug 2014-09-25 18:45:51