1. activemq.xml配置统计插件:
<broker>
<plugins>
<statisticsBrokerPlugin/>
</plugins>
</broker>
2. java代码
public class StatisticsQueueMessageServlet extends HttpServlet {
private static final long serialVersionUID = 1L;private final static Log LOG = Log.getLog(StatisticsQueueMessageServlet.class);
private String brokerURL = "vm://localhost";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// ConnectionFactory :连接工厂,JMS 用它创建连接
ConnectionFactory connectionFactory;
Connection connection;
Session session;
try {
connectionFactory = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,brokerURL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE);
StringBuilder builder = new StringBuilder("统计信息为:\n");
if (request.getParameter("type").equals("broker")) {
processBroker(builder, session);
}else if (request.getParameter("type").equals("destnation")) {
processDestnation(builder,session,request.getParameter("queueName"));
}
session.close();
connection.close();
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
response.getWriter().print(builder.toString());
response.getWriter().flush();
} catch (JMSException e) {
LOG.error("JMSException : ", e);
} catch (IOException e) {
LOG.error("IOException : ", e);
}
}
private void processDestnation(StringBuilder builder, Session session,String queueName) throws JMSException {
Queue replyTo = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(replyTo);
MessageProducer producer = session.createProducer(null);
Queue destnation = session.createQueue(queueName);
String queryQueueName = "ActiveMQ.Statistics.Destination." + destnation.getQueueName();
Queue query = session.createQueue(queryQueueName);
Message msg = session.createMessage();
producer.send(destnation, msg);
msg.setJMSReplyTo(replyTo);
producer.send(query, msg);
MapMessage reply = (MapMessage) consumer.receive();
Assert.notNull(reply);
Assert.isTrue(reply.getMapNames().hasMoreElements());
for (Enumeration<?> e = reply.getMapNames();e.hasMoreElements();) {
String name = e.nextElement().toString();
builder.append(name+"="+reply.getObject(name)+"\n");
}
}
private void processBroker(StringBuilder builder, Session session) throws JMSException {
Queue replyTo = session.createTemporaryQueue();
MessageConsumer consumer = session.createConsumer(replyTo);
String queueName ="ActiveMQ.Statistics.Broker";
Queue testQueue = session.createQueue(queueName);
MessageProducer producer = session.createProducer(testQueue);
Message msg = session.createMessage();
msg.setJMSReplyTo(replyTo);
producer.send(msg);
MapMessage reply = (MapMessage) consumer.receive();
Assert.notNull(reply);
for(Enumeration<?> e = reply.getMapNames();e.hasMoreElements();) {
String name = e.nextElement().toString();
builder.append(name+"="+reply.getObject(name)+"\n");
}
}
}
3. 统计结果展示:
vm=vm://localhost
memoryUsage=0
storeUsage=3330
tempPercentUsage=0
ssl=
openwire=tcp://localhost:50059
brokerId=ID:bigmac-50057-1253605065511-0:0
consumerCount=2
brokerName=localhost
expiredCount=0
dispatchCount=1
maxEnqueueTime=5.0
storePercentUsage=0
dequeueCount=0
inflightCount=1
messagesCached=0
tempLimit=107374182400
averageEnqueueTime=5.0
stomp+ssl=
memoryPercentUsage=0
size=10
tempUsage=0
producerCount=1
minEnqueueTime=5.0
dataDirectory=/Users/rajdavies/dev/projects/activemq/activemq-core/activemq-data
enqueueCount=10
stomp=
storeLimit=107374182400
memoryLimit=67108864