【发布时间】:2012-01-29 04:27:37
【问题描述】:
任何人都可以帮助在 java 中编写获取队列深度的代码。我们在 IBM WebSphere MQ 中有 4 个队列,其中有消息。
我想编写一个 jsp 来在运行报告时读取队列名称及其深度。 我该怎么做?
【问题讨论】:
任何人都可以帮助在 java 中编写获取队列深度的代码。我们在 IBM WebSphere MQ 中有 4 个队列,其中有消息。
我想编写一个 jsp 来在运行报告时读取队列名称及其深度。 我该怎么做?
【问题讨论】:
我看到回复access queue with Websphere MQ API
您是否查看过 JMX 上下文中的 MBean 可访问性?如果我必须这样做,我会在 Mbean 中公开它。
你可以在那里看到IBM JMS Topologies
对于监控和检查资源的状态,例如队列深度,有几个选项。首选选项是使用 Application Serve 提供的 JMX Mbean 进行监视:JMSBasicFunction、JMSAdministration 和 EmbeddedJMSAdministration。 您可以通过 wsadmin 或以编程方式访问这些 Mbean。其次,您可以使用传统的 WMQ 管理实用程序(例如 runmqsc 或 MQExplorer)来查看队列和其他资源。如果您确实使用这些实用程序,那么您必须不对 Application Server 队列管理器和队列进行任何配置更改。这些资源在 Application Server 的控制之下。使用 MQ 实用程序更改这些资源会导致配置无效
不知道您是否在 WAS 服务器上以及这是否仍然是相同的 MBean,但您应该在您的 AS 上找到等效的 Mbean。
【讨论】:
见http://blog.guymahieu.com/2008/06/11/getting-the-depth-of-an-mqseries-queue-from-java/。
我重新实现了如下:
import com.ibm.mq.*;
public class QueueManager {
private final String host;
private final int port;
private final String channel;
private final String manager;
private final MQQueueManager qmgr;
public QueueManager(String host, int port, String channel, String manager) throws MQException {
this.host = host;
this.port = port;
this.channel = channel;
this.manager = manager;
this.qmgr = createQueueManager();
}
public int depthOf(String queueName) throws MQException {
MQQueue queue = qmgr.accessQueue(queueName, MQC.MQOO_INQUIRE | MQC.MQOO_INPUT_AS_Q_DEF, null, null, null);
return queue.getCurrentDepth();
}
@SuppressWarnings("unchecked")
private MQQueueManager createQueueManager() throws MQException {
MQEnvironment.channel = channel;
MQEnvironment.port = port;
MQEnvironment.hostname = host;
MQEnvironment.properties.put(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES);
return new MQQueueManager(manager);
}
}
将以下 jars 放在你的类路径中:
【讨论】: