1.1.以windows发布tomcat服务,并且启动tomcat,则如下
l cmd -> regedit打开注册表,找到如下服务,在Java ->Options原内容下新增如下内容:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9009 –>jmx端口
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
import java.io.IOException;
import java.lang.management.MemoryUsage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Tomcat应用服务器操作工具类
*/
public class TomcatServerUtil {
/**
* 根据tomcat应用服务器对应的jmx地址获取应用服务器信息 注:参照《tomcat服务器信息监控.docx》文档进行配置方可使用本方法
*
* @param jmxURL
* :应用服务器对应的jmx地址
* @return
* @throws ZysoftException
*/
public static Map<String, Object> getTomcatServerInfo(String jmxURL)
throws Exception {
Map<String, Object> serverInfo = new HashMap<String, Object>();
JMXConnector connector = null;
try {
JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
connector = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
// ------------------------- 获取tomcat应用服务器系统信息
// ----------------------
String serverIp = jmxURL.substring((jmxURL.lastIndexOf("//") + 1),
jmxURL.lastIndexOf("/"));// 应用服务器IP
ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName,
"StartTime"));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
String systemFactory = (String) mbsc.getAttribute(runtimeObjName,
"VmVendor");// 厂商
String program = (String) mbsc.getAttribute(runtimeObjName,
"VmName");// 程序
String version = (String) mbsc.getAttribute(runtimeObjName,
"VmVersion");// 版本
String startTime = df.format(starttime);// tomcat启动时间
String continueWorkTime = TomcatServerUtil.formatTimeSpan(timespan);// tomcat连续工作时间
// ------------------------ 获取tomcat应用服务器中java的JVM虚拟空间信息
// -------------------------
// 堆使用率
ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
MemoryUsage heapMemoryUsage = MemoryUsage
.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
"HeapMemoryUsage"));
long maxMemory = heapMemoryUsage.getMax();// 堆最大
long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
long usedMemory = heapMemoryUsage.getUsed();
String setJvmMemory = heapMemoryUsage.getInit() / 1024 / 1024
+ "MB";// 设置的JVM堆内存
String maxJvmMemory = maxMemory / 1024 / 1024 + "MB";// 最大堆内存
String currJvmMemory = commitMemory / 1024 / 1024 + "MB";// 当前堆内存
String usedJvmMemory = usedMemory / 1024 / 1024 + "MB";// 已使用堆内存
String freeJvmMemory = (maxMemory - usedMemory) / 1024 / 1024
+ "MB";// 剩余堆内存
String usedPercent = (double) usedMemory * 100 / commitMemory + "%";// heap堆使用率
/*
System.out.println("--------------------获取【" + serverIp
+ "】应用服务器信息-------------------------");
System.out.println("厂商systemFactory:" + systemFactory);
System.out.println("程序program:" + program);
System.out.println("版本version:" + version);
System.out.println("启动时间startTime:" + startTime);
System.out.println("连续工作时间continueWorkTime:" + continueWorkTime);
System.out.println("设置的JVM堆内存setJvmMemory:" + setJvmMemory);
System.out.println("最大堆内存maxJvmMemory:" + maxJvmMemory);
System.out.println("当前堆内存currJvmMemory:" + currJvmMemory);
System.out.println("已使用堆内存usedJvmMemory:" + usedJvmMemory);
System.out.println(" 剩余堆内存freeJvmMemory:" + freeJvmMemory);
System.out.println("heap堆使用率usedPercent:" + usedPercent);
*/
MemoryUsage nonheapMemoryUsage = MemoryUsage
.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
"NonHeapMemoryUsage"));
long noncommitMemory = nonheapMemoryUsage.getCommitted();
long nonusedMemory = heapMemoryUsage.getUsed();
String nonUsedPercent = (double) nonusedMemory * 100
/ noncommitMemory + "%";// heap堆未使用率
// System.out.println("heap堆未使用率:" + nonUsedPercent);
// 封装应用服务器信息并返回
serverInfo.put("systemFactory", systemFactory);
serverInfo.put("program", program);
serverInfo.put("version", version);
serverInfo.put("startTime", startTime);
serverInfo.put("continueWorkTime", continueWorkTime);
serverInfo.put("setJvmMemory", setJvmMemory);
serverInfo.put("maxJvmMemory", maxJvmMemory);
serverInfo.put("currJvmMemory", currJvmMemory);
serverInfo.put("usedJvmMemory", usedJvmMemory);
serverInfo.put("freeJvmMemory", freeJvmMemory);
serverInfo.put("usedPercent", usedPercent);
serverInfo.put("nonUsedPercent", nonUsedPercent);
serverInfo.put("currentThreadCount", "1");
serverInfo.put("maxThreads", "500");
// -------------------- 获取tomcat应用服务器的Session会话信息 ---------------
/*
* ObjectName managerObjName = new
* ObjectName("Catalina:type=Manager,*"); Set<ObjectName>
* s=mbsc.queryNames(managerObjName, null); for (ObjectName obj:s){
* System.out.println("应用名:"+obj.getKeyProperty("path")); ObjectName
* objname=new ObjectName(obj.getCanonicalName());
* System.out.println("最大会话数:"+ mbsc.getAttribute( objname,
* "maxActiveSessions")); System.out.println("会话数:"+
* mbsc.getAttribute( objname, "activeSessions"));
* System.out.println("活动会话数:"+ mbsc.getAttribute( objname,
* "sessionCounter")); }
*/
// ----------------- 获取tomcat应用服务器的线程池Thread Pool信息----------------
ObjectName threadpoolObjName = new ObjectName(
"Catalina:type=ThreadPool,*");
Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
for (ObjectName obj : s2) {
String name = obj.getKeyProperty("name");// 端口名
if (name.indexOf("http-") == -1) {
continue;
}
ObjectName objname = new ObjectName(obj.getCanonicalName());
Object maxThreads = mbsc.getAttribute(objname, "maxThreads");// 最大线程数
Object currentThreadCount = mbsc.getAttribute(objname,
"currentThreadCount");// 当前线程数
Object currentThreadsBusy = mbsc.getAttribute(objname,
"currentThreadsBusy");// 繁忙线程数
serverInfo.put("portName", name);
serverInfo.put("maxThreads", maxThreads);
serverInfo.put("currentThreadCount", currentThreadCount);
serverInfo.put("currentThreadsBusy", currentThreadsBusy);
/*
System.out.println("端口名name:" + name);
System.out.println("最大线程数maxThreads:" + maxThreads);
System.out.println("当前线程数currentThreadCount:" + currentThreadCount);
System.out.println("繁忙线程数currentThreadsBusy:" + currentThreadsBusy);
*/
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception(e);
} finally {
try {
if (connector != null)
connector.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
return serverInfo;
}
public static String formatTimeSpan(long span) {
long minseconds = span % 1000;
span = span / 1000;
long seconds = span % 60;
span = span / 60;
long mins = span % 60;
span = span / 60;
long hours = span % 24;
span = span / 24;
long days = span;
return (new Formatter()).format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d",
days, hours, mins, seconds, minseconds).toString();
}
}