/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.catalina.ha.backend; /* for MBean to read ready and busy */ import java.util.Iterator; import java.util.Set; import javax.management.MBeanServer; import javax.management.ObjectInstance; import javax.management.ObjectName; import org.apache.tomcat.util.modeler.Registry; /* * Listener to provider informations to mod_heartbeat.c * *msg_format = "v=%u&ready=%u&busy=%u"; (message to send). * send the multicast message using the format... * what about the bind(IP. port) only IP makes sense (for the moment). * BTW:v = version :-) */ public class CollectedInfo { /* Collect info via JMX */ protected MBeanServer mBeanServer = null; protected ObjectName objName = null; int ready; int busy; int port = 0; String host = null; public CollectedInfo(String host, int port) throws Exception { init(host, port); } public void init(String host, int port) throws Exception { int iport = 0; String shost = null; mBeanServer = Registry.getRegistry(null, null).getMBeanServer(); String onStr = "*:type=ThreadPool,*"; ObjectName objectName = new ObjectName(onStr); Set<ObjectInstance> set = mBeanServer.queryMBeans(objectName, null); Iterator<ObjectInstance> iterator = set.iterator(); while (iterator.hasNext()) { ObjectInstance oi = iterator.next(); objName = oi.getObjectName(); String name = objName.getKeyProperty("name"); /* Name are: * http-8080 * jk-10.33.144.3-8009 * jk-jfcpc%2F10.33.144.3-8009 */ String [] elenames = name.split("-"); String sport = elenames[elenames.length-1]; iport = Integer.parseInt(sport); String [] shosts = elenames[1].split("%2F"); shost = shosts[0]; if (port==0 && host==null) break; /* Take the first one */ if (host==null && iport==port) break; /* Only port done */ if (shost.compareTo(host) == 0) break; /* Done port and host are the expected ones */ } if (objName == null) throw(new Exception("Can't find connector for " + host + ":" + port)); this.port = iport; this.host = shost; } public void refresh() throws Exception { if (mBeanServer == null || objName == null) { throw(new Exception("Not initialized!!!")); } Integer imax = (Integer) mBeanServer.getAttribute(objName, "maxThreads"); // the currentThreadCount could be 0 before the threads are created... // Integer iready = (Integer) mBeanServer.getAttribute(objName, "currentThreadCount"); Integer ibusy = (Integer) mBeanServer.getAttribute(objName, "currentThreadsBusy"); busy = ibusy.intValue(); ready = imax.intValue() - ibusy.intValue(); } }