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