如何获取jms队列中挂起的消息数

如何获取jms队列中挂起的消息数,jms,activemq,Jms,Activemq,是否有任何方法可以获取jms队列中挂起消息的计数。我的目标是,如果队列中没有要处理的消息,则关闭连接。我怎样才能做到这一点 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url); Connection connection = connectionFactory.createConnection("admin", "admin"); connection.start();

是否有任何方法可以获取jms队列中挂起消息的计数。我的目标是,如果队列中没有要处理的消息,则关闭连接。我怎样才能做到这一点

    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
    Connection connection = connectionFactory.createConnection("admin", "admin");
    connection.start();

    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    Destination destination = session.createQueue(subject);

    MessageConsumer consumer = session.createConsumer(destination);

    while (true) {
        Message message = consumer.receive();

        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            System.out.println("Incoming Message:: '" + textMessage.getText() + "'");
        }
    }

我使用createBrowser完成了这项工作,下面是我的更新代码

public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection("admin", "admin");
connection.start();

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createQueue(subject);
int queueSize = QueueConsumer.getQueueSize(session, (Queue) destination);
System.out.println("QUEUE SIZE: " + queueSize);
MessageConsumer consumer = session.createConsumer(destination);

for (int i = 0; i < queueSize; i++) {
    Message message = consumer.receive();

    if (message instanceof TextMessage) {
        TextMessage textMessage = (TextMessage) message;
        System.out.println("Incomming Message: '" + textMessage.getText() + "'");
    }
}
connection.close();
}

private int getQueueSize(Session session, Queue queue) {
    int count = 0;
    try {
        QueueBrowser browser = session.createBrowser(queue);
        Enumeration elems = browser.getEnumeration();
        while (elems.hasMoreElements()) {
            elems.nextElement();
            count++;
        }
    } catch (JMSException ex) {
        ex.printStackTrace();
    }
    return count;
}
publicstaticvoidmain(String[]args)抛出JMSException{
ConnectionFactory ConnectionFactory=新的ActiveMQConnectionFactory(url);
Connection=connectionFactory.createConnection(“admin”、“admin”);
connection.start();
会话会话=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
目的地=session.createQueue(subject);
int queueSize=QueueConsumer.getQueueSize(会话,(队列)目的地);
System.out.println(“队列大小:“+queueSize”);
MessageConsumer=session.createConsumer(目的地);
对于(int i=0;i
我使用createBrowser完成了这项工作,下面是我的更新代码

public static void main(String[] args) throws JMSException {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
Connection connection = connectionFactory.createConnection("admin", "admin");
connection.start();

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createQueue(subject);
int queueSize = QueueConsumer.getQueueSize(session, (Queue) destination);
System.out.println("QUEUE SIZE: " + queueSize);
MessageConsumer consumer = session.createConsumer(destination);

for (int i = 0; i < queueSize; i++) {
    Message message = consumer.receive();

    if (message instanceof TextMessage) {
        TextMessage textMessage = (TextMessage) message;
        System.out.println("Incomming Message: '" + textMessage.getText() + "'");
    }
}
connection.close();
}

private int getQueueSize(Session session, Queue queue) {
    int count = 0;
    try {
        QueueBrowser browser = session.createBrowser(queue);
        Enumeration elems = browser.getEnumeration();
        while (elems.hasMoreElements()) {
            elems.nextElement();
            count++;
        }
    } catch (JMSException ex) {
        ex.printStackTrace();
    }
    return count;
}
publicstaticvoidmain(String[]args)抛出JMSException{
ConnectionFactory ConnectionFactory=新的ActiveMQConnectionFactory(url);
Connection=connectionFactory.createConnection(“admin”、“admin”);
connection.start();
会话会话=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
目的地=session.createQueue(subject);
int queueSize=QueueConsumer.getQueueSize(会话,(队列)目的地);
System.out.println(“队列大小:“+queueSize”);
MessageConsumer=session.createConsumer(目的地);
对于(int i=0;i
从代理获取真实队列计数的唯一可靠方法是对队列使用,并调用getQueueSize方法

另一种编程方法是使用,这要求您能够更改代理配置以安装它。安装后,您可以向控制队列发送一条特殊消息,并获得一个响应,其中包含要监视的目标的详细信息


使用QueueBrowser不会给您一个真实的计数,因为浏览器对它将分页到内存中发送给您的消息的数量有一个最大限制,因此,如果您的队列深度超过该限制,您将无法得到实际大小,而只能得到最大页面大小限制的值

从代理获取真实队列计数的唯一可靠方法是对队列使用,并调用getQueueSize方法

另一种编程方法是使用,这要求您能够更改代理配置以安装它。安装后,您可以向控制队列发送一条特殊消息,并获得一个响应,其中包含要监视的目标的详细信息


使用QueueBrowser不会给您一个真实的计数,因为浏览器对它将分页到内存中发送给您的消息的数量有一个最大限制,因此,如果您的队列深度超过该限制,您将无法得到实际大小,而只能得到最大页面大小限制的值

如果JMS消息为空,只需中断循环并关闭连接即可

   while (true) {
    Message message = consumer.receive(2000);
    if (message == null){
        break;
    }
    if (message instanceof TextMessage) {
        TextMessage textMessage = (TextMessage) message;
        System.out.println("Incoming Message:: '" + textMessage.getText() + "'");
     }
   }
  connection.close();

如果JMS消息为空,只需中断循环并关闭连接

   while (true) {
    Message message = consumer.receive(2000);
    if (message == null){
        break;
    }
    if (message instanceof TextMessage) {
        TextMessage textMessage = (TextMessage) message;
        System.out.println("Incoming Message:: '" + textMessage.getText() + "'");
     }
   }
  connection.close();

我和jmx一起做了这件事,它对thanx@Tim Bish有效

这是我的更新代码

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://0.0.0.0:44444/jndi/rmi://0.0.0.0:1099/karaf-root");

HashMap<String, String[]> environment = new HashMap<String, String[]>();
String[] creds = { "admin", "admin" };
environment.put(JMXConnector.CREDENTIALS, creds);

JMXConnector jmxc = JMXConnectorFactory.connect(url, environment);
MBeanServerConnection connection = jmxc.getMBeanServerConnection();

ObjectName nameConsumers = new ObjectName("org.apache.activemq:type=Broker,brokerName=amq,destinationType=Queue,destinationName=myqueue");
DestinationViewMBean mbView = MBeanServerInvocationHandler.newProxyInstance(connection, nameConsumers, DestinationViewMBean.class, true);
long queueSize = mbView.getQueueSize();
System.out.println(queueSize);
JMXServiceURL=newjmxserviceurl(“服务:jmx:rmi://0.0.0.0:44444/jndi/rmi://0.0.0.0:1099/karaf-根“);
HashMap环境=新建HashMap();
字符串[]creds={“admin”,“admin”};
put(JMXConnector.CREDENTIALS、creds);
JMXConnector jmxc=JMXConnectorFactory.connect(url,环境);
MBeanServerConnection=jmxc.getMBeanServerConnection();
ObjectName nameConsumers=new ObjectName(“org.apache.activemq:type=Broker,brokerName=amq,destinationType=Queue,destinationName=myqueue”);
DestinationViewMBean mbView=MBeanServerInvocationHandler.newProxyInstance(连接,名称使用者,DestinationViewMBean.class,true);
long queueSize=mbView.getQueueSize();
System.out.println(队列大小);

我已经用jmx完成了这项工作,它在thanx@Tim Bish有效

这是我的更新代码

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://0.0.0.0:44444/jndi/rmi://0.0.0.0:1099/karaf-root");

HashMap<String, String[]> environment = new HashMap<String, String[]>();
String[] creds = { "admin", "admin" };
environment.put(JMXConnector.CREDENTIALS, creds);

JMXConnector jmxc = JMXConnectorFactory.connect(url, environment);
MBeanServerConnection connection = jmxc.getMBeanServerConnection();

ObjectName nameConsumers = new ObjectName("org.apache.activemq:type=Broker,brokerName=amq,destinationType=Queue,destinationName=myqueue");
DestinationViewMBean mbView = MBeanServerInvocationHandler.newProxyInstance(connection, nameConsumers, DestinationViewMBean.class, true);
long queueSize = mbView.getQueueSize();
System.out.println(queueSize);
JMXServiceURL=newjmxserviceurl(“服务:jmx:rmi://0.0.0.0:44444/jndi/rmi://0.0.0.0:1099/karaf-根“);
HashMap环境=新建HashMap();
字符串[]creds={“admin”,“admin”};
put(JMXConnector.CREDENTIALS、creds);
JMXConnector jmxc=JMXConnectorFactory.connect(url,环境);
MBeanServerConnection=jmxc.getMBeanServerConnection();
ObjectName nameConsumers=new ObjectName(“org.apache.activemq:type=Broker,brokerName=amq,destinationType=Queue,destinationName=myqueue”);
DestinationViewMBean mbView=MBeanServerInvocationHandler.newProxyInstance(连接,名称使用者,DestinationViewMBean.class,true