Ibm mq 使用java清除来自mq的消息

Ibm mq 使用java清除来自mq的消息,ibm-mq,Ibm Mq,使用Java和JMS连接到websphere mq v7.1并清除一个或多个指定队列的所有消息的最佳方法是什么?我是否需要使用Websphere MQ特定的java API?谢谢。像所有好问题一样,“这要看情况而定。” 只有在队列上没有打开的句柄时,才能使用命令清除队列。在这种情况下,发送PCF命令以清除队列是非常有效的,但如果存在打开的句柄,则会返回一个错误。PCF命令当然是Java特性,而不是JMS,因为它们是WebSphereMQ专有的 另一方面,任何被授权执行破坏性退出队列的程序都可以清

使用Java和JMS连接到websphere mq v7.1并清除一个或多个指定队列的所有消息的最佳方法是什么?我是否需要使用Websphere MQ特定的java API?谢谢。

像所有好问题一样,“这要看情况而定。”

只有在队列上没有打开的句柄时,才能使用命令清除队列。在这种情况下,发送PCF命令以清除队列是非常有效的,但如果存在打开的句柄,则会返回一个错误。PCF命令当然是Java特性,而不是JMS,因为它们是WebSphereMQ专有的

另一方面,任何被授权执行破坏性退出队列的程序都可以清除队列。在这种情况下,只需在get上循环,直到得到2033返回代码,指示队列为空。这可以使用JMS或Java来执行,但这两种方法都可以为您管理输入缓冲区。如果队列真的很深,那么你最终会移动所有数据,如果应用程序与客户端连接,那么你将以网络速度而不是在内存中移动数据

要解决这个问题,您需要指定最小数量的缓冲区,并且作为get选项之一,还需要指定
MQGMO.TRUNCATED\u MSG\u ACCEPTED
。这在get调用过程中只移动消息头,速度会明显加快


最后,如果您是以编程方式执行此操作,并且无论使用哪种方法,请分离多个线程,而不要使用同步点。实际上,您必须竭尽全力在队列上获取独占输入,因此一旦获得会话,就可以从中生成许多线程。优雅地关闭每个线程,并在所有线程关闭后关闭会话。

谢谢。我将采用使用JMS api消费消息的方法。