如何获取jms队列中的待处理消息数

时间:2017-04-08 08:03:44

标签: jms activemq

有没有办法在jms队列中获取未决消息的计数。我的目标是在队列中没有剩余消息要处理时关闭连接。我怎样才能做到这一点。

final long MILLION = 1000000L;
    final long BILLION = 1000000000L;
    final long TRILLION = 1000000000000L;
    final long THOUSAND = 1000L;

    NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
    rangeAxis.setNumberFormatOverride(new NumberFormat() {

        @Override
        public Number parse(String source, ParsePosition parsePosition) {
            return null;
        }

        @Override
        public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {

            String temp =  number < THOUSAND ? String.valueOf(number) :
                number < MILLION ?  (int)(number / THOUSAND) + " K" :
                number < BILLION ?  (int)(number / MILLION) + " M" :
                number < TRILLION ? (int)(number / BILLION) + " B" : 
                (int)(number / TRILLION) + " T";
            return new StringBuffer(temp);
        }

        @Override
        public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {

            String temp =  number < THOUSAND ? String.valueOf(number) :
                number < MILLION ?  (int)(number / THOUSAND) + " K" :
                number < BILLION ?  (int)(number / MILLION) + " M" :
                number < TRILLION ? (int)(number / BILLION) + " B" : 
                (int)(number / TRILLION) + " T";
            return new StringBuffer(temp);
        }
    });

5 个答案:

答案 0 :(得分:2)

从代理获取真正的队列计数的唯一可靠方法是使用JMX MBean作为队列并调用getQueueSize方法。

另一种编程替代方法是使用Statistics Broker Plugin,这要求您能够更改代理配置以进行安装。安装完成后,您可以向控制队列发送特殊消息,并获取包含您要监控的目标详细信息的响应。

使用QueueBrowser并不会给你一个真正的计数,因为浏览器对你要发送给你的内存的邮件数量有最大限制,所以如果你的队列超过你赢得的限制,那么获取实际大小,只是最大页面大小限制的值。

答案 1 :(得分:1)

我用jmx完成了这项工作,比起@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);

答案 2 :(得分:0)

如果您的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();

答案 3 :(得分:0)

很大的帮助! getQueueSize()正是我正在寻找的方法:)如果队列没有卡住,我正在进行自动监视。

答案 4 :(得分:-1)

我通过使用下面的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;
}