2

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

4

1 回答 1

2

像所有好的问题一样,“这取决于。”

仅当队列上没有打开的句柄时,才能使用命令清除队列。在这种情况下,发送一个 PCF 命令来清除队列是非常有效的,但是如果有打开的句柄,你会得到一个错误。PCF 命令当然是 Java 功能而不是 JMS,因为它们是 WebSphere MQ 专有的。

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

为了解决这个问题,您需要指定最少量的缓冲区,并且作为 GET 选项之一还指定MQGMO.TRUNCATED_MSG_ACCEPTED. 这仅在 get 调用期间移动消息头,并且可以显着加快。

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

于 2012-07-17T02:32:56.720 回答