您的位置:首页 > 运维架构 > Tomcat

JMX监控tomcat的配置 银行安全系统的心得

2017-08-22 15:59 537 查看
1.测试环境 ubuntu版本 Linux系统

2.eclipse+Mac环境

3.ftp软件FileZilla

Linux需要配置信息(catalina.sh)。

配置前信息:



配置后信息:



其中
1.Dcom.sun.management.jmxremote.port=1099设置的是你用来运行监听程序的端口号。在设置端口号前,务必保证端口号没有被其他程序占用。
2.Dcom.sun.management.jmxremote.ssl=false设置的是不开启ssl安全认证。
3.  Dcom.sun.management.jmxremote.authenticate=false设置的是不开启用户名和密码认证,如果要开启该认证需要去jdk中的etc/java/management中的jmxremote.access和jmxremote.password中最后两行的#去掉。即可以打开用户名密码认证。
4.  Djava.rmi.server.hostname=192.168.31.79这里的ip则需要设置你运行tomcat环境的ip地址。


下面则是代码运行jmx获取tomcat信息的代码片

import java.text.*;
import java.util.*;

import javax.management.*;
import javax.management.openmbean.*;
import javax.management.remote.*;
import java.lang.management.*;

public class jmx_tomocat {
private static Formatter format = new Formatter();

public static void main(String[] args) {
try{

String jmxUrl = "service:jmx:rmi:///jndi/rmi://192.168.31.79:1099/jmxrmi"; //动态唯一变量

java.util.Map<String , String []> map = new java.util.HashMap<String , String []>();

JMXServiceURL serviceURL = new JMXServiceURL(jmxUrl);

//          String [] credentials = new String[] { "monitorRole", "QED" };
//          map.put("jmx.remote.credentials", credentials);   //使用密码安全认证的情况

map.put("jmx.remote.credentials", null);  //不使用密码安全认证的情况

// JMXConnector connector = JMXConnectorFactory.connect(serviceURL,
// map);
JMXConnector connector = javax.management.remote.JMXConnectorFactory.connect(serviceURL, null);

MBeanServerConnection mbsc = connector.getMBeanServerConnection();

// 端口最好是动态取得
ObjectName grpObjName = new ObjectName("Catalina:type=GlobalRequestProcessor,*");
Set<ObjectName> grps = mbsc.queryNames(grpObjName, null);
for (ObjectName obj : grps) {
System.out.println("名称:" + obj.getKeyProperty("name"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("bytesReceived:" + mbsc.getAttribute(objname, "bytesReceived"));
System.out.println("bytesSent:" + mbsc.getAttribute(objname, "bytesSent"));
System.out.println("requestCount:" + mbsc.getAttribute(objname, "requestCount"));
}

ObjectName threadObjName = new ObjectName("Catalina:type=ThreadPool,name=\"*http*\"");
Set<ObjectName> smbi = mbsc.queryNames(threadObjName, null);
for (ObjectName obj : smbi) {
System.out.println("端口名:" + obj.getKeyProperty("name"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大线程数:" + mbsc.getAttribute(objname, "maxThreads"));
System.out.println("当前线程数:" + mbsc.getAttribute(objname, "currentThreadCount"));
System.out.println("繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy"));
}

// ObjectName threadObjName1 = new
// ObjectName("Catalina:type=ThreadPool,name=\"http-apr-8080\"");
// MBeanInfo mbInfo = mbsc.getMBeanInfo(threadObjName1);
//
// String attrName = "currentThreadCount";// tomcat的线程数对应的属性值
// MBeanAttributeInfo[] mbAttributes = mbInfo.getAttributes();
// System.out.println("currentThreadCount:" +
// mbsc.getAttribute(threadObjName1, attrName));

// heap
for (int j = 0; j < mbsc.getDomains().length; j++) {
System.out.println("###########" + mbsc.getDomains()[j]);
}

Set<?> MBeanset = mbsc.queryMBeans(null, null);
System.out.println("MBeanset.size() : " + MBeanset.size());
Iterator<?> MBeansetIterator = MBeanset.iterator();
while (MBeansetIterator.hasNext()) {
ObjectInstance objectInstance = (ObjectInstance) MBeansetIterator.next();
ObjectName objectName = objectInstance.getObjectName();
String canonicalName = objectName.getCanonicalName();
System.out.println("canonicalName : " + canonicalName);
if (canonicalName.equals("Catalina:host=localhost,type=Cluster")) {
// Get details of cluster MBeans
System.out.println("Cluster MBeans Details:");
System.out.println("=========================================");
// getMBeansDetails(canonicalName);
String canonicalKeyPropList = objectName.getCanonicalKeyPropertyListString();
System.out.println(canonicalKeyPropList);
}
}
// ------------------------ system ----------------------
ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
System.out.println("厂商:" + (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
System.out.println("程序:" + (String) mbsc.getAttribute(runtimeObjName, "VmName"));
System.out.println("版本:" + (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName, "StartTime"));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("启动时间:" + df.format(starttime));

Long timespan = (Long) mbsc.getAttribute(runtimeObjName, "Uptime");
System.out.println("连续工作时间:" + jmx_tomocat.formatTimeSpan(timespan));

// ----------------------- JVM -------------------------
// 堆使用率
ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
MemoryUsage heapMemoryUsage = MemoryUsage
.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "HeapMemoryUsage"));
long maxMemory = heapMemoryUsage.getMax();// 堆最大
System.out.println("heap size:" + maxMemory);
long commitMemory = heapMemoryUsage.getCommitted();// 堆当前分配
long usedMemory = heapMemoryUsage.getUsed();
System.out.println("heap:" + (double) usedMemory * 100 / commitMemory + "%");// 堆使用率

MemoryUsage nonheapMemoryUsage = MemoryUsage
.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "NonHeapMemoryUsage"));
long noncommitMemory = nonheapMemoryUsage.getCommitted();
long nonusedMemory = heapMemoryUsage.getUsed();
System.out.println("nonheap:" + (double) nonusedMemory * 100 / noncommitMemory + "%");

ObjectName permObjName = new ObjectName("java.lang:type=MemoryPool,name=*Perm*Gen*");
Set<ObjectName> sperm = mbsc.queryNames(permObjName, null);
for (ObjectName obj : sperm) {
ObjectName objname = new ObjectName(obj.getCanonicalName());
MemoryUsage permGenUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(objname, "Usage"));
long committed = permGenUsage.getCommitted();// 持久堆大小
long used = heapMemoryUsage.getUsed();//
System.out.println("perm gen:" + (double) used * 100 / committed + "%");// 持久堆使用率
}

// ------------------- 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"));
}

// ---------------- Thread Pool ----------------
ObjectName threadpoolObjName = new ObjectName("Catalina:type=ThreadPool,*");
Set<ObjectName> s2 = mbsc.queryNames(threadpoolObjName, null);
for (ObjectName obj : s2) {
System.out.println("端口名:" + obj.getKeyProperty("name"));
ObjectName objname = new ObjectName(obj.getCanonicalName());
System.out.println("最大线程数:" + mbsc.getAttribute(objname, "maxThreads"));
System.out.println("当前线程数:" + mbsc.getAttribute(objname, "currentThreadCount"));
System.out.println("繁忙线程数:" + mbsc.getAttribute(objname, "currentThreadsBusy"));
}

}catch(Exception ee){
ee.printStackTrace();
}
}

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 format.format("%1$d天 %2$02d:%3$02d:%4$02d.%5$03d", days, hours, mins, seconds, minseconds).toString();
}
}


当然在强大的java中 也自带了图形界面监控tomcat的服务,只需要在cmd命令行输入jvisualvm就可以开启。填上ip和端口即可以通过图形界面监控tomcat了。

上面用到的ftp+FileZille只是我不想用vim模式。而偷的懒而已。各位看官不要在乎~。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: