6

我正在使用 Hornetq 2.0 我不明白我如何知道目前队列中有多少消息。

这是一个非常有用的功能,因此我可以在运行时知道我的消费者是否足够快地消费消息。

我没有使用 JMS api,而是使用高度优化的核心 API。

获取队列中消息数量的正确(最快)方法是什么?

我找到了两种方法,但不知道什么是正确的方法。

public int size(){

    ClientSession session;

    try {

        session = sf.createSession(false, false, false);

        ClientRequestor requestor = new ClientRequestor(session, "hornetq.management");

        ClientMessage m = session.createMessage(false);

        ManagementHelper.putAttribute(m, "core.queue." + queueName, "messageCount");

        ClientMessage reply = requestor.request(m);

        int count = (Integer) ManagementHelper.getResult(reply);

        return count;

    } catch (Exception e) {

        e.printStackTrace();

    }

    return 0;

}

或者

public synchronized int size(){

    ClientSession coreSession = null;

    int count = 0;

    try {

        coreSession = sf.createSession(false, false, false);

        ClientSession.QueueQuery result;

        result = coreSession.queueQuery(new SimpleString(queueName));

        count = result.getMessageCount();

    } catch (HornetQException e) {

        e.printStackTrace();

    } finally {

        if (coreSession!= null ){

            try {

                coreSession.close();

            } catch (HornetQException e) {

                e.printStackTrace();

            }

        }

    }

    return count;

}
4

4 回答 4

7

我找到了这两种方法

public synchronized int size(){
    ClientSession session;
    try {
        session = sf.createSession(false, false, false);
        ClientRequestor requestor = new ClientRequestor(session, "hornetq.management");
        ClientMessage m = session.createMessage(false);
        ManagementHelper.putAttribute(m, "core.queue." + queueName, "messageCount");
        ClientMessage reply = requestor.request(m);
        int count = (Integer) ManagementHelper.getResult(reply);
        return count;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return 0;
}

public synchronized int size(){
    ClientSession coreSession = null;
    int count = 0;
    try {
        coreSession = sf.createSession(false, false, false);
        ClientSession.QueueQuery result;
        result = coreSession.queueQuery(new SimpleString(queueName));
        count = result.getMessageCount();
    } catch (HornetQException e) {
        e.printStackTrace();
    } finally {
        if (coreSession!= null ){
            try {
                coreSession.close();
            } catch (HornetQException e) {
                e.printStackTrace();
            }
        }
    }
    return count;
}
于 2011-02-11T20:03:58.113 回答
2

您必须使用管理界面,本文档末尾是检索消息计数的示例:http: //hornetq.sourceforge.net/docs/hornetq-2.0.0.GA/user-manual/en/html/ management.html#management.message-counters

于 2011-02-09T03:15:40.837 回答
1

hornetq-2.2.14.Final 附带了一个关于消息计数器的示例。它位于 hornetq-2.2.14.Final/examples/jms/message-counters

于 2012-11-13T10:22:45.803 回答
0

断章取义但很有用,如果您使用的是 jboss,那么您可以使用下面的 cli 命令来获取队列消息计数。/subsystem=messaging/hornetq-server=default/jms-queue=:read-attribute(name=message-count)

于 2019-12-17T14:33:40.617 回答