【问题标题】:find the queue depth of MQ查找 MQ 的队列深度
【发布时间】:2019-10-29 18:06:08
【问题描述】:

我想查找 MQ 的当前队列深度。我的程序可以在队列上读写。

我可以编写一个消费者来消费队列中的消息。我可以使用计数器来计算队列中有多少消息。但我需要在不丢失消息的情况下找到队列深度。

try {
        // Create a connection factory
        JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
        JmsConnectionFactory cf = ff.createConnectionFactory();

        // Set the properties
        cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, HOST);
        cf.setIntProperty(WMQConstants.WMQ_PORT, PORT);
        cf.setStringProperty(WMQConstants.WMQ_CHANNEL, CHANNEL);
        cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
        cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, QMGR);
        cf.setStringProperty(WMQConstants.WMQ_APPLICATIONNAME, "JmsPutGet (JMS)");
        cf.setBooleanProperty(WMQConstants.USER_AUTHENTICATION_MQCSP, true);
        cf.setStringProperty(WMQConstants.USERID, APP_USER);
        cf.setStringProperty(WMQConstants.PASSWORD, APP_PASSWORD);

        // Create JMS objects
        context = cf.createContext();
        destination = context.createQueue("queue:///" + QUEUE_NAME);

        long uniqueNumber = System.currentTimeMillis() % 1000;
        TextMessage message = context.createTextMessage("Your lucky number today is " + uniqueNumber);

        producer = context.createProducer();
        producer.send(destination, message);
        System.out.println("Sent message:\n" + message);

        consumer = context.createConsumer(destination); // autoclosable
        String receivedMessage = consumer.receiveBody(String.class, 15000); // in ms or 15 seconds

        System.out.println("\nReceived message:\n" + receivedMessage);

        recordSuccess();
    }

代码应该打印队列深度。

【问题讨论】:

  • 看来你的问题已经在这里回答了:stackoverflow.com/questions/8660991/…
  • 你为什么要这样做?
  • 这只是为了学习。我想看看 MQ 服务器有多少条消息。
  • 获取队列深度的另一种方法是使用 JMS 浏览器并计算 msgs。但是,获取队列深度并不是应用程序的常见任务。如果您的应用程序是此队列中唯一的应用程序,为什么不立即读取所有消息?无论如何,您将需要它们。如果此队列中还有其他应用,则可能在获取后编号错误(其他应用可能同时添加/删除了消息)

标签: java jms mq


【解决方案1】:

队列深度可以通过浏览消息来计算。浏览不消耗消息。

Connection connection = connectionFactory.createConnection();
connection.start();

Session session = connection.createSession(false, Session.DUPS_OK_ACKNOWLEDGE);
Queue q = session.createQueue("exampe_queue");
QueueBrowser browser = session.createBrowser(q);
Enumeration enumeration = browser.getEnumeration();

long msgCounter = 0;
while (enumeration.hasMoreElements()) {
    Message msg = (Message) enumeration.nextElement();
    msgCounter += 1;
}

System.out.println("Queue depth: " + msgCounter);

但是这种方法非常,因为客户端正在从代理中提取消息。如果您需要偶尔检查队列深度以进行监控或类似用途,它将起作用。

更好的解决方案是使用 get-me-a-q-depth 调用,但这不是 JMS api 指定的;但是它通常存在于特定于实现的库中。

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多