使用Java和JMS连接到websphere mq v7.1并清除一个或多个指定队列的所有消息的最佳方法是什么?我是否需要使用Websphere MQ特定的Java API?感谢。
答案 0 :(得分:2)
像所有好问题一样,“这取决于。”
只有队列中没有打开句柄时,才能使用命令清除队列。在这种情况下,发送PCF命令以清除队列是非常有效的,但如果有打开的句柄,则会收到错误。 PCF命令当然是Java特性而不是JMS,因为它们是WebSphere MQ专有的。
另一方面,任何被授权执行破坏性的程序都可以清除队列。在这种情况下,只需循环获取,直到获得2033返回代码,指示队列为空。这可以使用JMS或Java执行,但这两者都可以为您管理输入缓冲区。如果队列非常深,那么您最终会移动所有数据,如果应用程序是客户端连接的,那么您将以网络速度而不是内存中移动它。
要解决此问题,您需要指定最小量的缓冲区,并且其中一个GET选项也指定MQGMO.TRUNCATED_MSG_ACCEPTED
。这在get调用期间仅移动消息头,并且可以明显更快。
最后,如果您以编程方式执行此操作,并且无论使用哪种方法,请关闭多个线程,不要使用同步点。你实际上必须不遗余力地在队列中获得独占输入,所以一旦你得到一个会话,就会产生许多线程。正常关闭每个线程,并在所有线程关闭后关闭会话。