所谓JMX,是Java Management Extensions(Java管理扩展)的缩写,是一个为应用程序植入管理功能的框架。用户可以在任何Java应用程序中使用这些代理和服务实现管理。
一、JMX架构图
从图中我们可以看到,JMX的结构一共分为三层:
1、 基础层:主要是Mbean,被管理的java bean
Mbean分为如下四中
类型 | 描述 |
---|---|
standard MBean | 这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。 |
dynamic MBean | 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义 |
model MBean | 与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到model MBean中。 |
2、适配层:MbeanServer,提供对资源的注册和管理
3、接入层: 提供远程访问的入口
二、standard MBean演示
1、根据standard MBean的要求,我们首先要定义一个MBean接口,接口的命名规范以具体的实现类为前缀,为了后续可以注册到
MBean Server中
package jmx; public interface HelloMBean { public String getName(); public void setName(String name); public String getAge(); public void setAge(String age); public void helloWorld(); public void helloWorld(String str); public void getTelephone(); }
2、定义一个实现类
package jmx; /* * 该类名称必须与实现的接口的前缀保持一致(即MBean前面的名称 */ public class Hello implements HelloMBean { private String name; private String age; public void getTelephone() { System.out.println("get Telephone"); } public void helloWorld() { System.out.println("hello world"); } public void helloWorld(String str) { System.out.println("helloWorld:" + str); } public String getName() { System.out.println("get name 123"); return name; } public void setName(String name) { System.out.println("set name 123"); this.name = name; } public String getAge() { System.out.println("get age 123"); return age; } public void setAge(String age) { System.out.println("set age 123"); this.age = age; } }
3、定义agent层
package jmx; import java.lang.management.ManagementFactory; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; public class HelloAgent { public static void main(String[] args) throws JMException, Exception { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName helloName = new ObjectName("jmxBean:name=hello"); //create mbean and register mbean server.registerMBean(new Hello(), helloName); Thread.sleep(60*60*1000); } }
1、 通过工厂类获取Mbean Server,用来做Mbean的容器
2、 ObjectName的取名规范:域名:name=Mbean名称,其中域名和Mbean的名称可以任取。这样定义后,我们可以唯一标示我们定义的这个Mbean的实现类了
3、最后将Hello这个类注册到MbeanServer中,注入需要创建一个ObjectName类,我们可以用jdk自带的Jconsole用来观察,可以设置属性值和调用相关方法。
三、Notification
MBean之间的通信是必不可少的,Notification起到了在MBean之间沟通桥梁的作用。JMX 的通知由四部分组成:
1、Notification这个相当于一个信息包,封装了需要传递的信息
2、Notification broadcaster这个相当于一个广播器,把消息广播出。
3、Notification listener 这是一个监听器,用于监听广播出来的通知信息。
4、Notification filiter 这个一个过滤器,过滤掉不需要的通知。这个一般很少使用。保留Hello及HelloMBean,增加如下
package jmx; public interface JackMBean { public void hi(); }
package jmx; import javax.management.Notification; import javax.management.NotificationBroadcasterSupport; public class Jack extends NotificationBroadcasterSupport implements JackMBean { private int seq = 0; public void hi() { //创建一个信息包 Notification notify = //通知名称;谁发起的通知;序列号;发起通知时间;发送的消息 new Notification("jack.hi",this,++seq,System.currentTimeMillis(),"jack"); sendNotification(notify); } }
这里的类Jack不仅实现了MBean接口,还继承了NotificationBroadcasterSupport。jack在这里创建并发送了一个消息包。
package jmx; import javax.management.Notification; import javax.management.NotificationListener; public class HelloListener implements NotificationListener { public void handleNotification(Notification notification, Object handback) { if(handback instanceof Hello) { Hello hello = (Hello)handback; hello.printHello(notification.getMessage()); } } }
对HelloAgent做以下修改
package jmx; import java.lang.management.ManagementFactory; import javax.management.JMException; import javax.management.MBeanServer; import javax.management.ObjectName; public class HelloAgent { public static void main(String[] args) throws JMException, Exception { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); ObjectName helloName = new ObjectName("yunge:name=Hello"); Hello hello=new Hello(); server.registerMBean(hello, helloName); Jack jack = new Jack(); server.registerMBean(jack, new ObjectName("jack:name=Jack")); jack.addNotificationListener(new HelloListener(), null, hello); Thread.sleep(500000); } }
我们利用jconsole调用jack的hi方法,这里当jack发出消息后,Notification被广播至所有的MBean,当有MBean属于Hello类时则调用Hello的printHello()方法。
四、JMX的应用
在linux下利用jmx监控Tomcat,在catlina.sh中进行一些环境变零的配置
配置 | 功能 |
---|---|
Dcom.sun.management.jmxremote=true | 相关 JMX 代理侦听开关 |
Djava.rmi.server.hostname | 服务器端的IP |
Dcom.sun.management.jmxremote.port=29094 | 相关 JMX 代理侦听请求的端口 |
Dcom.sun.management.jmxremote.ssl=false | 指定是否使用 SSL 通讯 |
Dcom.sun.management.jmxremote.authenticate=false | 指定是否需要密码验证 |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
除了通过chrome://extensions/管理Chrome扩展和应用外,也可以通过Chrome的management接口管理。management接口可以获取用户已安装的扩展和应用信息,同时还可以卸载和禁用它们。通过management接口可以编写出智能管理扩展和应用的程序。 要使用management接口,需要在Manifest中声明management权限: "permissions":
说到Seata中的配置管理,大家可能会想到Seata中适配的各种配置中心,其实今天要说的不是这个,虽然也会简单分析Seata和各配置中心的适配过程,但主要还是讲解Seata配置管理的核心实现 Server启动流程 在讲配置中心之前,先简单介绍一下Server端的启动流程,因为这一块就涉及到配置管理的初始化,核心流程如下: 程序入口在Server#main方法中 获取port的几种形式:从容器中获取
第六章介绍了 Django 的管理界面,现在是该回过头来仔细了解一下的时候了。 正如我们之前多次提到过的,Django 的管理界面是该框架的杀手级特性之一,多数 Django开发人员都知道它既省时又好用。由于该管理界面极受欢迎,对 Django 开发人员来说,想对它进行定制和拓展是件很平常的事情。 第六章的最后几节介绍了定制部分管理界面的一些简单方法。进入本章之前,请先复习一下那部分资料;其中涵盖
问题内容: 我的Go Web应用程序中有一个相当快捷的错误处理程序,它会引发HTTP错误,记录响应的重要部分并提供错误模板。我想删除在处理程序中多次编写类似代码的重复: 我已经阅读了Error Handling and Go文章,其中定义了一个自定义HTTP处理程序类型,该类型将返回这样的错误类型/结构(甚至返回int,err): 但是我不确定如何保留现有的中间件功能/包装,使我可以像这样链接中间
很多批处理问题都可以通过单进程、单线程的工作模式来完成, 所以在想要做一个复杂设计和实现之前,请审查你是否真的需要那些超级复杂的实现。 衡量实际作业(job)的性能,看看最简单的实现是否能满足需求: 即便是最普通的硬件,也可以在一分钟内读写上百MB数据文件。 当你准备使用并行处理技术来实现批处理作业时,Spring Batch提供一系列选择,本章将对他们进行讲述,虽然某些功能不在本章中涵盖。从高层
扩展说明 将 Invoker 接口转换成业务接口。 扩展接口 org.apache.dubbo.rpc.ProxyFactory 扩展配置 <dubbo:protocol proxy="xxx" /> <!-- 缺省值配置,当<dubbo:protocol>没有配置proxy属性时,使用此配置 --> <dubbo:provider proxy="xxx" /> 已知扩展 org.apache.