`
zhangwei_david
  • 浏览: 477104 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JMX 基础Demo

    博客分类:
  • JMX
 
阅读更多

        JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等

优点可以非常容易的使应用程序具有被管理
伸缩性的架构每个JMX Agent服务可以很容易的放入到Agent中,每个JMX的实现都提供几个核心的Agent服务,你也可以自己编写服务,服务可以很容易的部署,取消部署。
 
  • MBean方式

   一个MBean 是一个遵循特定设计模式的和实现了特定接口的Java对象。MBean管理接口有如下描述:

  1. 可访问的属性值
  2. 可调用的操作
  3. 可以发送的消息
  4. MBean java的构造器

任何一个作为MBean的java实现的java对象,被注册到代理上后,都可以从代理机构的JVM外管理。

JMX定义了四周类型的MBean,标准MBean,动态MBean,开放MBean和模型MBean

  1. 标准MBean是最简单的实现,他们的管理接口是通过方法名描述的。MXBean是是一种标准的MBean,它使用开放的MBean概念,在简化代码的同事,达到易于管理的目的。
  2. 动态MBean必须实现特定的接口,但是他们在运行时对外提供管理接口,所以具有很大的灵活性。
  3. 开放MBean是动态MBean
  4. 模型MBean也是动态MBean,它是运行时完全可配置和自我描述的。它们为动态设备层资源提供具有默认行为的一般MBean类。

 

这些对

主要提供接口,允许有不同的实现
/**
 *定义一个普通的接口
 *
 * @author zhangwei_david
 * @version $Id: HiMBean.java, v 0.1 2015年1月24日 下午1:16:15 zhangwei_david Exp $
 */
public interface HiMBean {
    /**
     *打招呼
     */
    public void sayHello();

    /**
     * 加法计算器
     *
     * @param x
     * @param y
     * @return
     */
    public int add(int x, int y);

    /**
     * 获取名称
     *
     * @return
     */
    public String getName();

    /**
     *获取缓存大小
     *
     * @return
     */
    public int getCacheSize();

    /**
     *设置缓存大小
     *
     * @param size
     */
    public void setCacheSize(int size);
}
/**
 *简单实现类
 * @author Lenovo
 * @version $Id: Hi.java, v 0.1 2014年9月26日 下午2:48:09 Lenovo Exp $
 */
public class HiMbeanImpl implements HiMBean {

    private final String     name               = "Reginald";
    private int              cacheSize          = DEFAULT_CACHE_SIZE;
    private static final int DEFAULT_CACHE_SIZE = 200;

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#sayHello()
     */
    public void sayHello() {
        System.out.println("Hello," + getName());
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#add(int, int)
     */
    public int add(int x, int y) {
        return x + y;
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#getName()
     */
    public String getName() {
        return name;
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#getCacheSize()
     */
    public int getCacheSize() {
        return cacheSize;
    }

    /**
     * @see com.cathy.demo.jmx.notifications.HiMBean#setCacheSize(int)
     */
    public void setCacheSize(int size) {
        cacheSize = size;
    }

}

 

使用 Model MBean 的过程也是下面几步:

  1. 创建一个 MBServer:mBeanServe
  2. 获得管理资源用的 MBean:serverBean
  3. 给这个 MBean 一个 ObjectName:serverMBeanName
  4. 将 serverBean 以 serverMBeanName 注册到 mBeanServer 上去
/**
 * 
 * 
 * @author zhangwei_david
 * @version $Id: Main.java, v 0.1 2015年6月19日 下午1:10:03 zhangwei_david Exp $
 */
public class Main {

    /**
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //获取Mean的平台服务
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        // 对即将被注册的MBean 构造一个ObjectName
        ObjectName objectName = new ObjectName("com.cathy.demo.jmx:type=Hi");
        // 创建一个Mbean
        RequiredModelMBean mbean = new RequiredModelMBean();
        HiMbeanImpl hiMbean = new HiMbeanImpl();
        mbean.setManagedResource(hiMbean, "objectReference");

        ModelMBeanAttributeInfo name = new ModelMBeanAttributeInfo("name", "java.lang.String",
            "userName", true, true, false, new DescriptorSupport(new String[] { "name=name",
                    "descriptorType=attribute", "getMethod=getName", "setMethod=setName" }));

        ModelMBeanOperationInfo sayHello = new ModelMBeanOperationInfo("say Hello", hiMbean
            .getClass().getMethod("sayHello"));
        // 创建一个ModelMBeanOperationInfo
        ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo("get userName", hiMbean
            .getClass().getMethod("getName"));

        // 使用ModelMbeanAttributeInfo和ModelMbeanOperationInfo构建一个ModelMBeanInfo对象
        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport("HiMbean", "Test",
            new ModelMBeanAttributeInfo[] { name }, null, new ModelMBeanOperationInfo[] { sayHello,
                    getName }, null);
        // 向ModelMBean 设置ModelMBeanInfo
        mbean.setModelMBeanInfo(mbeanInfo);

        // 将Mbean 注册到MBeanServer
        mbs.registerMBean(mbean, objectName);
        // 一直等待
        System.out.println("Waiting forever...");
        Thread.sleep(Long.MAX_VALUE);

    }
}

 

运行后的可以通过jconsole看到MBean



 

通过HTML页面管理MBean

 

/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2014 All Rights Reserved.
 */
package com.cathy.demo.jmx;

import java.lang.management.ManagementFactory;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.modelmbean.DescriptorSupport;
import javax.management.modelmbean.ModelMBeanAttributeInfo;
import javax.management.modelmbean.ModelMBeanInfo;
import javax.management.modelmbean.ModelMBeanInfoSupport;
import javax.management.modelmbean.ModelMBeanOperationInfo;
import javax.management.modelmbean.RequiredModelMBean;

import com.sun.jdmk.comm.HtmlAdaptorServer;

/**
 *
 *
 * @author zhangwei_david
 * @version $Id: Main.java, v 0.1 2015年6月19日 下午1:10:03 zhangwei_david Exp $
 */
public class Main {

    /**
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        //获取Mean的平台服务
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        // 对即将被注册的MBean 构造一个ObjectName
        ObjectName objectName = new ObjectName("com.cathy.demo.jmx:type=Hi");
        // 创建一个Mbean
        RequiredModelMBean mbean = new RequiredModelMBean();
        HiMbeanImpl hiMbean = new HiMbeanImpl();
        mbean.setManagedResource(hiMbean, "objectReference");

        ModelMBeanAttributeInfo name = new ModelMBeanAttributeInfo("name", "java.lang.String",
            "userName", true, true, false, new DescriptorSupport(new String[] { "name=name",
                    "descriptorType=attribute", "getMethod=getName", "setMethod=setName" }));

        ModelMBeanOperationInfo sayHello = new ModelMBeanOperationInfo("say Hello", hiMbean
            .getClass().getMethod("sayHello"));
        // 创建一个ModelMBeanOperationInfo
        ModelMBeanOperationInfo getName = new ModelMBeanOperationInfo("get userName", hiMbean
            .getClass().getMethod("getName"));

        // 使用ModelMbeanAttributeInfo和ModelMbeanOperationInfo构建一个ModelMBeanInfo对象
        ModelMBeanInfo mbeanInfo = new ModelMBeanInfoSupport("HiMbean", "Test",
            new ModelMBeanAttributeInfo[] { name }, null, new ModelMBeanOperationInfo[] { sayHello,
                    getName }, null);
        // 向ModelMBean 设置ModelMBeanInfo
        mbean.setModelMBeanInfo(mbeanInfo);

        // 将Mbean 注册到MBeanServer
        mbs.registerMBean(mbean, objectName);

        // 创建一个HtmlAdapterServer MBean
        HtmlAdaptorServer htmlAdaptorServer = new HtmlAdaptorServer();
        // 修改端口号
        htmlAdaptorServer.setPort(8082);
        // 将html适配器MBean 注入到MBeanServer,该处port仅仅是描述
        mbs.registerMBean(htmlAdaptorServer, new ObjectName("Adaptor:name=html,port=8082"));
        // 启动适配器
        htmlAdaptorServer.start();
        // 一直等待
        System.out.println("Waiting forever...");
        Thread.sleep(Long.MAX_VALUE);

    }
}

可以通过 http://localhost:8082/ 访问



 

点击【type=Hi】进入MBean视图页面



 

  •  MXBean
/**
 *MXBean参数对象
 * @author zhangwei_david
 * @version $Id: QueueSample.java, v 0.1 2015年6月20日 下午4:30:30 zhangwei_david Exp $
 */
public class QueueSample {

    private final Date   date;
    private final int    size;
    private final String head;

    @ConstructorProperties({ "date", "size", "head" })
    public QueueSample(Date date, int size, String head) {
        this.date = date;
        this.size = size;
        this.head = head;
    }

    public Date getDate() {
        return date;
    }

    public int getSize() {
        return size;
    }

    public String getHead() {
        return head;
    }
}

 

/**
 *MXBean接口,定义两个操作
 *
 * @author zhangwei_david
 * @version $Id: QueueSamplerMXBean.java, v 0.1 2015年6月20日 下午4:31:34 zhangwei_david Exp $
 */
public interface QueueSamplerMXBean {

    public QueueSample getQueueSample();

    public void clearQueue();
}

 

/**
 *MXBean的实现类
 * @author zhangwei_david
 * @version $Id: QueueSampler.java, v 0.1 2015年6月20日 下午4:32:19 zhangwei_david Exp $
 */
public class QueueSampler implements QueueSamplerMXBean {

    private Queue<String> queue;

    public QueueSampler(Queue<String> queue) {
        this.queue = queue;
    }

    public QueueSample getQueueSample() {
        synchronized (queue) {
            return new QueueSample(new Date(), queue.size(), queue.peek());
        }
    }

    public void clearQueue() {
        synchronized (queue) {
            queue.clear();
        }
    }

}

 

/**
 * 测试方法
 * @author zhangwei_david
 * @version $Id: TestMain.java, v 0.1 2015年6月20日 下午4:33:35 zhangwei_david Exp $
 */
public class TestMain {
    public static void main(String[] args) throws Exception {
        //获取MBeanServer
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

        //构造一个ObjectName
        ObjectName mxbeanName = new ObjectName("com.example:type=QueueSampler");

        // 创建一个队列
        Queue<String> queue = new ArrayBlockingQueue<String>(10);
        queue.add("Request-1");
        queue.add("Request-2");
        queue.add("Request-3");
        // 构造一个mxbean
        QueueSampler mxbean = new QueueSampler(queue);

        // 注册mxbean
        mbs.registerMBean(mxbean, mxbeanName);

        //等待
        System.out.println("Waiting for incoming requests...");
        Thread.sleep(Long.MAX_VALUE);
    }
}

 

  •  动态MBean

/**
 * 动态MBean 示例
 * 
 * @author zhangwei_david
 * @version $Id: HelloDynamic.java, v 0.1 2015年6月21日 下午10:53:07 zhangwei_david Exp $
 */
public class HelloDynamic implements DynamicMBean {

    // 管理控件(MBean)属性
    private String                  name;

    // 动态创建MBean需要的变量
    private String                  className   = this.getClass().getName();
    // 描述
    private String                  description = "Simple implementation of a dynamic MBean.";
    //管理资源
    private MBeanAttributeInfo[]    attributes;
    // 构造方法
    private MBeanConstructorInfo[]  constructors;
    // 操作
    private MBeanOperationInfo[]    operations;

    private MBeanInfo               mBeanInfo;
    // 通知
    private MBeanNotificationInfo[] notifications;

    /**
     * 构造方法
     */
    public HelloDynamic() {
        init();
        buildDynamicMBean();
    }

    private void init() {
        className = this.getClass().getName();
        description = "Simple implementation of a dynamic MBean.";
        attributes = new MBeanAttributeInfo[1];
        constructors = new MBeanConstructorInfo[1];
        operations = new MBeanOperationInfo[1];
        notifications = new MBeanNotificationInfo[0];
    }

    private void buildDynamicMBean() {
        // 构造方法
        Constructor<?>[] ctors = this.getClass().getConstructors();
        constructors[0] = new MBeanConstructorInfo(
            "HelloDynamic(): Constructs a HelloDynamic object", ctors[0]);
        // 属性
        attributes[0] = new MBeanAttributeInfo("name", "java.lang.String", "Name: name string",
            true, true, false);
        // 方法
        MBeanParameterInfo[] params = null;
        operations[0] = new MBeanOperationInfo("print", "print(): print the name", params, "void",
            MBeanOperationInfo.INFO);
        // MBeanInfo
        mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations,
            notifications);
    }

    /**
     *
     * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
     */
    public Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException,
                                                ReflectionException {
        LoggerUtils.info("获取属性:" + attribute);
        if (attribute == null) {
            return null;
        }
        if ("name".equals(attribute)) {
            return name;
        }
        return null;
    }

    public AttributeList getAttributes(String[] attributes) {
        LoggerUtils.info("获取属性列表" + attributes);
        if (attributes == null) {
            return null;
        }
        AttributeList reslist = new AttributeList();

        for (String attr : attributes) {
            try {
                Object value = getAttribute(attr);
                reslist.add(new Attribute(attr, value));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return reslist;
    }

    /**
     *
     * @see javax.management.DynamicMBean#getMBeanInfo()
     */
    public MBeanInfo getMBeanInfo() {
        return mBeanInfo;
    }

    /**
     *
     * @see javax.management.DynamicMBean#invoke(java.lang.String, java.lang.Object[], java.lang.String[])
     */
    public Object invoke(String actionName, Object[] params, String[] signature)
                                                                                throws MBeanException,
                                                                                ReflectionException {
        LoggerUtils.info(MessageFormat.format("反射调用方法 {0},参数: {1}>签名 {2}", actionName, params,
            signature));
        if (actionName.equals("print")) {
            print();
        } else if ("dynamicPrint".equals(actionName)) {
            dynamicPrint();
        }
        return null;
    }

    /**
     *
     * @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
     */
    public void setAttribute(Attribute attribute) throws AttributeNotFoundException,
                                                 InvalidAttributeValueException, MBeanException,
                                                 ReflectionException {
        if (attribute == null) {
            return;
        }

        String attrname = attribute.getName();
        Object attrvalue = attribute.getValue();

        if ("name".equals(attrname)) {
            if (attrvalue == null) {
                name = null;
            } else {
                try {
                    if (Class.forName("java.lang.String").isAssignableFrom(attrvalue.getClass())) {
                        name = (String) attrvalue;
                    }
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     *
     * @see javax.management.DynamicMBean#setAttributes(javax.management.AttributeList)
     */
    public AttributeList setAttributes(AttributeList attributes) {
        if (attributes == null) {
            return null;
        }
        AttributeList reslist = new AttributeList();
        for (Object obj : attributes) {
            Attribute attr = (Attribute) obj;
            try {
                setAttribute(attr);
                String attrname = attr.getName();
                Object attrvalue = attr.getValue();
                reslist.add(new Attribute(attrname, attrvalue));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return reslist;
    }

    private void print() {
        System.out.println(MessageFormat.format("Hello {0}, This is helloDynamic", name));
        // add method dynamic at runtime
        operations = new MBeanOperationInfo[2];
        buildDynamicMBean();
        MBeanParameterInfo[] parameters = null;
        operations[1] = new MBeanOperationInfo("dynamicPrint",
            "dynamicPrint: Runtime generated by print method", parameters, "void",
            MBeanOperationInfo.INFO);
    }

    private void dynamicPrint() {
        System.out.println("This is a runtime generated method!");
    }

}

 

/**
 * 
 * 
 * @author zhangwei_david
 * @version $Id: HelloDynamicAgent.java, v 0.1 2015年6月21日 下午10:53:51 zhangwei_david Exp $
 */
public class HelloDynamicAgent {
    private static String DOMAIN = "MyDynamicMBean";

    /**
     * @param args
     * @throws NullPointerException
     * @throws MalformedObjectNameException
     * @throws NotCompliantMBeanException
     * @throws MBeanRegistrationException
     * @throws InstanceAlreadyExistsException
     */
    public static void main(String[] args) throws MalformedObjectNameException,
                                          NullPointerException, InstanceAlreadyExistsException,
                                          MBeanRegistrationException, NotCompliantMBeanException {
        //创建一个MBean服务对象,DOMAIN类似于java里面的公共package部分
        MBeanServer server = MBeanServerFactory.createMBeanServer(DOMAIN);
        //创建DynamicMBean对象
        HelloDynamic hello = new HelloDynamic();
        //创建一个web适配器服务器,表示我们MBean服务通过web形式来提供给用户管理
        HtmlAdaptorServer htmlserver = new HtmlAdaptorServer();
        htmlserver.setPort(9999);
        //ObjctName对象类似于完整的package
        ObjectName helloname = new ObjectName(DOMAIN + ":name=HelloDynamic");
        ObjectName htmlname = new ObjectName(DOMAIN + ":name=HtmlAdaptor");
        server.registerMBean(hello, helloname);
        server.registerMBean(htmlserver, htmlname);

        htmlserver.start();
    }

}

 

2015-06-21 22:51:17,854 DEBUG LoggerContext[name=sun.misc.Launcher$AppClassLoader@1d16e93, org.apache.logging.log4j.core.LoggerContext@1e7e365] started OK.
2015-06-21 22:51:17,856 DEBUG Using default SystemClock for timestamps
22:51:17.863 [Thread-1] INFO  com.cathy.demo.util.LoggerUtils - 获取属性:name
22:51:21.698 [Thread-1] INFO  com.cathy.demo.util.LoggerUtils - 反射调用方法 print,参数: [Ljava.lang.Object;@107c4b5>签名 [Ljava.lang.String;@a46b89
Hello David, This is helloDynamic

 

 

上述是发布一个Mbean,下面简单介绍一个远程调用一个MBean

/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2015 All Rights Reserved.
 */
package com.cathy.demo.jmx.notifications;

import java.lang.management.MemoryUsage;
import java.text.MessageFormat;
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;

/**
 *
 * @author zhangwei_david
 * @version $Id: ClientTest.java, v 0.1 2015年6月20日 下午4:52:49 zhangwei_david Exp $
 */
public class ClientTest {

    private static final long   KB_SIZE     = 1024;

    private static final String LOG_PATTERN = "{0}: 分配 {1} KB;  最大值 {2} KB; 已使用 {3} KB;  使用率 {4} %";

    /**
     *
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        JMXServiceURL serviceURL = new JMXServiceURL(
                "service:jmx:rmi://localhost/jndi/rmi://localhost:9999/jmxrmi");
        JMXConnector jmxc = JMXConnectorFactory.connect(serviceURL);
        MBeanServerConnection msc = jmxc.getMBeanServerConnection();
        // 获取所有的ObjectName
        Set<ObjectName> objectNames = msc.queryNames(null, null);
        for (ObjectName objectName : objectNames) {
            System.out.println("ObjectName:" + objectName.getCanonicalName() + ".");
        }

        ObjectName name = new ObjectName("java.lang:type=OperatingSystem");
        System.out.println(msc.getAttributes(name, new String[] { "CommittedVirtualMemorySize",
                                                                  "FreePhysicalMemorySize", "FreeSwapSpaceSize" }));

        printLog(msc, "java.lang:name=Metaspace,type=MemoryPool",
            "java.lang:name=Survivor Space,type=MemoryPool",
            "java.lang:name=Eden Space,type=MemoryPool",
            "java.lang:name=Code Cache,type=MemoryPool",
                "java.lang:name=Tenured Gen,type=MemoryPool");
    }

    private static void printLog(MBeanServerConnection msc, String... name) throws Exception {
        for (String string : name) {
            log(string, getUsageByName(msc, string));
        }
    }

    private static MemoryUsage getUsageByName(MBeanServerConnection msc, String name)
            throws Exception {
        return MemoryUsage.from((CompositeDataSupport) msc.getAttribute(new ObjectName(name),
            "Usage"));
    }

    private static void log(String key, MemoryUsage usage) {
        System.out.println();
        System.out.println(MessageFormat.format(LOG_PATTERN, key, usage.getCommitted() / KB_SIZE,
            usage.getMax() / KB_SIZE, usage.getUsed() / KB_SIZE,
            usage.getUsed() * 100 / usage.getCommitted()));
    }
}

 运行的结果是:

 

ObjectName:java.lang:name=Metaspace,type=MemoryPool.
ObjectName:java.lang:name=Eden Space,type=MemoryPool.
ObjectName:java.lang:name=Survivor Space,type=MemoryPool.
ObjectName:java.lang:name=Copy,type=GarbageCollector.
ObjectName:JMImplementation:type=MBeanServerDelegate.
ObjectName:java.lang:type=Runtime.
ObjectName:java.lang:type=Threading.
ObjectName:java.lang:type=OperatingSystem.
ObjectName:java.lang:name=MarkSweepCompact,type=GarbageCollector.
ObjectName:java.lang:name=Code Cache,type=MemoryPool.
ObjectName:java.nio:name=direct,type=BufferPool.
ObjectName:java.lang:type=Compilation.
ObjectName:java.lang:name=Tenured Gen,type=MemoryPool.
ObjectName:java.lang:name=CodeCacheManager,type=MemoryManager.
ObjectName:java.lang:type=Memory.
ObjectName:java.nio:name=mapped,type=BufferPool.
ObjectName:java.util.logging:type=Logging.
ObjectName:java.lang:type=ClassLoading.
ObjectName:java.lang:name=Metaspace Manager,type=MemoryManager.
ObjectName:com.sun.management:type=DiagnosticCommand.
ObjectName:com.sun.management:type=HotSpotDiagnostic.
[CommittedVirtualMemorySize = 33554432, FreePhysicalMemorySize = 3817508864, FreeSwapSpaceSize = 9955905536]

java.lang:name=Metaspace,type=MemoryPool: 分配 5,120 KB;  最大值 0 KB; 已使用 5,025 KB;  使用率 98 %

java.lang:name=Survivor Space,type=MemoryPool: 分配 512 KB;  最大值 8,704 KB; 已使用 0 KB;  使用率 0 %

java.lang:name=Eden Space,type=MemoryPool: 分配 4,480 KB;  最大值 69,952 KB; 已使用 1,244 KB;  使用率 27 %

java.lang:name=Code Cache,type=MemoryPool: 分配 992 KB;  最大值 32,768 KB; 已使用 961 KB;  使用率 96 %

java.lang:name=Tenured Gen,type=MemoryPool: 分配 10,944 KB;  最大值 174,784 KB; 已使用 1,915 KB;  使用率 17 %

 

  • 大小: 33.5 KB
  • 大小: 21.5 KB
  • 大小: 25.2 KB
  • 大小: 38 KB
27
11
分享到:
评论

相关推荐

    javasnmp源码-02-jmx-demo:如何使用JMX来管理程序

    JMX的基础架构; 如何使用JMX。 JMX的基础架构 首先,看下这种图: 这里简单介绍下这三层结构: 层次 描述 Instrumentation 主要包括了一系列的接口定义和描述如何开发MBean的规范。在JMX中MBean代表一个被管理的...

    jmx简单实例,附带jar包完整项目

    1. **JMX基础** JMX由三部分组成:MBeans(Managed Beans)、Servers和Agents。MBeans代表管理的对象,可以是任何Java对象,它们提供了关于对象状态的信息和对这些对象的操作。MBean Server是管理对象的核心组件,...

    SpringBoot基础入门demo

    **SpringBoot基础入门** SpringBoot是由Pivotal团队提供的全新框架,其设计目标...通过这个“SpringBoot基础入门demo”,你可以深入了解和实践SpringBoot的核心特性,为后续的深入学习和实际项目开发打下坚实的基础。

    activemq_demo,activeMQ的简单demo

    【描述】中提到的"activeMQ的简单demo"是指一个基础的示例项目,旨在帮助开发者快速理解和使用ActiveMQ。通过导入此项目并运行,你可以直观地看到ActiveMQ如何工作,如何发送和接收消息,以及如何配置和管理消息队列...

    zookeeper入门练习demo

    3. **JMX监控**:Zookeeper支持JMX(Java Management Extensions),可以与其他管理工具结合,如JConsole或VisualVM,对Zookeeper进行性能监控。 通过这个"Zookeeper入门练习Demo",你可以动手实践Zookeeper的基本...

    stormdemo.zip

    在“stormdemo”这个示例中,我们可以看到如何设置和运行一个基础的Storm拓扑。 首先,了解Storm的基本组件至关重要。Storm中的核心组件包括:Topology(拓扑)、Spout(喷口)和Bolt(螺栓)。Topology是Storm应用...

    ActiveMQ实例Demo

    **ActiveMQ实例Demo详解** Apache ActiveMQ是一款开源的消息中间件,它是Java消息服务(JMS)的实现,...通过学习这个实例,我们可以更好地理解ActiveMQ的工作原理和使用方法,为构建高效、可靠的分布式系统打下基础。

    activeMQ 入门级demo

    首先去...⒉ 有的时候由于端口被占用,导致ActiveMQ错误,ActiveMQ可能需要以下端口1099(JMX),61616(默认的TransportConnector) ⒊ 如果没有物理网卡,或者MS的LoopBackAdpater Multicast会报一个错误

    quartz-demo.zip

    1. **Quartz基础**: - **Job接口**:Quartz的核心接口,定义了一个执行任务的类需要实现的方法。 - **Trigger**:负责触发Job的执行,可以设置定时规则,如简单触发器、cron触发器等。 - **Scheduler**:调度器...

    activemq Demo

    在这个"activemq Demo"中,我们可以探索ActiveMQ的基本概念、SSL/TLS安全配置以及如何在实际项目中应用。 首先,ActiveMQ作为消息代理,它遵循了多种消息传递协议,如OpenWire、AMQP、STOMP、MQTT等,这些协议使得...

    metrics-demo:一个演示指标的简单项目

    4. **报告和可视化**:"metrics-demo"可能会展示如何将收集到的指标报告给外部服务,如Graphite、Prometheus或JMX,以便进一步分析和可视化。这通常涉及到配置报告器并指定报告频率。 5. **集成测试**:项目可能...

    Agent-demo:阿里第四届天池中间件大赛官方给的agent-demp

    7. **日志与监控**:如Log4j、SLF4J进行日志记录,以及使用JMX、Prometheus、Grafana等工具进行系统监控。 8. **分布式**:如果是一个分布式中间件,那么可能需要了解分布式一致性(如Raft、Paxos协议),分布式锁...

    JRockit远程监控Linux环境下WebLogic方案

    4. **配置JMX安全**:创建一个密码文件(如`/home/rock/jmxremote.pwd`),在模板文件`jmxremote.password.template`的基础上,添加用户名和密码,用于JMX远程连接的身份验证。 5. **更新hosts文件**:如果需要通过...

    jmetertests

    jmetertests 使用JMeter和Azure容器实例进行分布式测试 要构建Controller Docker映像,请查看并运行... demo.jmx只是用于演示目的的简单测试。 PS不要忘记在运行脚本之前使用“ az登录”登录到azure :)

    Joram on java

    - **JMX管理**:介绍如何通过JMX(Java Management Extensions)进行Joram的监控与管理,适用于生产环境下的运维操作。 #### 专业目的地 Joram还支持几种特殊类型的目的地,如DeadMessageQueue、HierarchicalTopic...

    asm bytecode

    - **AdventNet**的JMX+BCI:结合JMX和字节码增强技术。 - **Eclipse**:在单元测试和性能分析等方面使用。 - **面向切面编程(AOP)**:如AspectJ和AspectWerkz。 - **大多数Java性能分析工具**:如JProbe、Optimizeit...

    example for activity study

    "java crazy demo chapter 1 example of activity study" 这个描述可能指向一个教程或示例项目,旨在通过实际的编程练习来阐述活动研究的应用。在这个章节中,开发者可能会学习如何在Java项目中运用活动研究的技术,...

    一篇就懂SpringBoot案例

    同时,SpringBoot翻译.png和SpringBoot翻译.psd可能是对文章内容的辅助说明材料,yun1.sql可能是一个示例数据库脚本,springboot-demo则可能是实际运行的项目源码。通过阅读文章和分析示例,读者能更深入地理解和...

    spring-logback日志项目模块

    在运行时,你可以通过JMX(Java Management Extensions)或者Spring Boot Actuator的端点来改变日志级别。 在实际开发中,我们通常会根据不同的环境(如开发、测试、生产)配置不同的日志级别。Spring Boot允许我们...

    DemoApcas

    首先,我们要理解Java性能监控的基础知识。Java提供了一套名为JMX(Java Management Extensions)的框架,允许开发者创建、管理和监视各种资源,包括应用程序自身。APCAS可能利用了JMX来收集和展示性能数据。 其次...

Global site tag (gtag.js) - Google Analytics