有没有办法在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);
}
});
答案 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;
}