The source file for this code example is DestMetrics.java. This client application monitors a specific destination on a broker. It accepts the destination type and name as parameters, and it constructs a metrics topic name of the form mq.metrics.destination.queue.monitored_destination_name or mq.metrics.destination.topic.monitored_destination_name .
Example 4–6 shows how to subscribe to the metrics topic for monitoring a specified destination.
com.sun.messaging.TopicConnectionFactory metricConnectionFactory; TopicConnection metricConnection; TopicSession metricSession; TopicSubscriber metricSubscriber; Topic metricTopic; String metricTopicName = null; String destName = null, destType = null; for (int i = 0; i < args.length; ++i) { ... } else if (args[i].equals("-n")) { destName = args[i+1]; } else if (args[i].equals("-t")) { destType = args[i+1]; } } metricConnectionFactory = new com.sun.messaging.TopicConnectionFactory(); metricConnection = metricConnectionFactory.createTopicConnection(); metricConnection.start(); metricSession = metricConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); if (destType.equals("q")) { metricTopicName = "mq.metrics.destination.queue." + destName; } else { metricTopicName = "mq.metrics.destination.topic." + destName; } metricTopic = metricSession.createTopic(metricTopicName); metricSubscriber = metricSession.createSubscriber(metricTopic); metricSubscriber.setMessageListener(this);
The incoming message is processed in the onMessage() method, as shown in Example 4–7:
public void onMessage(Message m) { try { MapMessage mapMsg = (MapMessage)m; String type = mapMsg.getStringProperty("type"); if (type.equals(metricTopicName)) { String oneRow[] = new String[ 11 ]; int i = 0; /* * Extract destination metrics */ oneRow[i++] = Long.toString(mapMsg.getLong("numMsgsIn")); oneRow[i++] = Long.toString(mapMsg.getLong("numMsgsOut")); oneRow[i++] = Long.toString(mapMsg.getLong("msgBytesIn")); oneRow[i++] = Long.toString(mapMsg.getLong("msgBytesOut")); oneRow[i++] = Long.toString(mapMsg.getLong("numMsgs")); oneRow[i++] = Long.toString(mapMsg.getLong("peakNumMsgs")); oneRow[i++] = Long.toString(mapMsg.getLong("avgNumMsgs")); oneRow[i++] = Long.toString(mapMsg.getLong("totalMsgBytes")/1024); oneRow[i++] = Long.toString (mapMsg.getLong("peakTotalMsgBytes")/1024); oneRow[i++] = Long.toString (mapMsg.getLong("avgTotalMsgBytes")/1024); oneRow[i++] = Long.toString(mapMsg.getLong("peakMsgBytes")/1024); mp.add(oneRow); ... } } catch (Exception e) { System.err.println("onMessage: Exception caught: " + e); } }
Notice how the metrics type is extracted, using the getStringProperty() method as in the previous examples, and is checked. Also notice how various destination data are extracted, using the getLong() method of mapMsg.
You can run this example monitoring client with one of the following commands:
java DestMetrics -t t -n topic_name java DestMetrics -t q -n queue_name
Using a queue named SimpleQueue as an example, the command would be:
java DestMetrics -t q -n SimpleQueue
The output looks like the following:
------------------------------------------------------------------------------ Msgs Msg Bytes Msg Count Tot Msg Bytes(k) Largest Msg In Out In Out Curr Peak Avg Curr Peak Avg (k) ------------------------------------------------------------------------------ 500 0 318000 0 500 500 250 310 310 155 0 |