2014-09-23 117 views
2

我们有一个应用程序使用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消息()会有理想的效果吗?还是有什么我失踪?

感谢您的帮助, 道格

+0

in activemq你可以直接使用这个消息,但我不确定这是否意味着读取消息来做到这一点。确实很好的问题。 – Leo 2014-09-23 22:54:09

+0

消息从服务器到客户端的传输方式非常正确。是否有关于消息的某些内容,如确定是否应该删除消息的属性?或者是否有其他标准? – Calanais 2014-09-24 06:38:47

+0

数据库中的状态码告诉应用程序不再需要队列中的消息(由于其他故障情况)。我无法清除整个队列,因为还有其他线程正在处理其他消息。我只是想清除特定的消息而不下载它们,而这似乎不可能使用JMS。 – Doug 2014-09-25 18:45:51

回答

1

有没有其他办法,消息必须消耗采取从队列中删除。

从AUTO_ACKNOWLEDGE更改为CLIENT_ACKNOWLEDGE不会有任何区别,因为确认是告诉消息传递提供程序从队列中删除消息的方式。 AUTO_ACKNOWLEDGE选项告诉JMS客户端自动向提供者发送确认消息,而应用程序使用CLIENT_ACKNOWLEDGE来明确告诉提供者删除消息。

您可以看看如何设置您不打算使用的消息的到期时间。到期时间设置的邮件在到期时间结束后将不可用于投放。阅读消息的JMSExpiration属性。

0

考虑到这一些更多的想法,并有可能在这里另一种方式; MQ具有PCF消息的概念 - 只需将管理命令作为消息发送到队列管理器即可。

JMS可以发送这些消息 - 因此一旦您知道不需要更多消息,就会发送CLEAR_QUEUE命令。

这是一个相当广泛的方法 - 清除整个队列,但这取决于您的标准是用于删除邮件。

但是,我可以看到用例有选择地删除消息 - 可能值得在IBM developerWorks站点上提出'请求增强'RFE?

+0

如果IPPROCS和/或OPPROCS不为零,则PCF CLEAR_QUEUE命令将不起作用。 – Roger 2014-09-24 16:58:19

0

据我所知,JMS无法读取消息的一部分。您只能使用C或Java(非JMS)来执行此操作。

MQGetMessageOptions gmo = new MQGetMessageOptions(); 
gmo.options = MQC.MQGMO_NO_WAIT + MQC.MQGMO_FAIL_IF_QUIESCING; 

MQMessage getMsg = new MQMessage(); 
try 
{ 
    /* get the message with only 1 byte of message data */ 
    _inQ.get(getMsg, gmo, 1); 
} 
catch (MQException e) 
{ 
    System.err.println(e.getLocalizedMessage()); 
} 
+0

大家好,谢谢你的回复。我曾尝试使用客户确认模式,正如Shashi所预测的那样,它没有任何作用。不幸的是,我不能清除整个队列。我现在的选择是让消息过期或全部下载。不幸的是,让他们过期似乎不适合我。测试表明,当我们孤立许多4MB消息而其他线程正在检索消息时(我们使用关联ID检索它们),队列管理器的性能会降低。再次感谢大家的反馈意见。 – Doug 2014-09-25 17:40:04