ibm-mq - 使用java清除mq中的消息

标签 ibm-mq

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

最佳答案

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

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

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

要解决此问题,您需要指定最小量的缓冲区,并且作为 GET 选项之一,还指定 MQGMO.TRUNCATED_MSG_ACCEPTED。这只会在 get 调用期间移动消息 header ,并且速度会明显加快。

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

关于ibm-mq - 使用java清除mq中的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512916/

相关文章:

c# - 如何从 IBM MQ 上的 put 方法获得确认?

java - IBM MQ 7 文件传输

linux - Spring CachingConnectionFactory 在 Linux 主机上的 Tomcat 关闭期间不关闭共享的 MQQueueConnection

ibm-mq - Websphere MQ 接收 channel 启动缓慢

c# - 如何获取 Websphere MQ 连接状态以及如何重置连接 :

c# - 从 C# 代码创建 IBM MQ 队列

java - 如何启用 Websphere MQ 的客户端日志记录?

c# - 如何为队列管理器别名设置 WebSphereMQ 消息传输头

java - PutApplicationName 与 PutApplName

ibm-mq - channel 类型 SVRCONN 和 SDR/RCVR 之间有什么区别?如何决定何时使用 SVRCONN 或 SDR/RCVR 对?