Java管理扩展JMX之HelloWord篇

JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

  • 用于发布服务的接口类ITestHelloMXBean.java

[codesyntax lang="java" lines="normal"]

package org.suren.littlebird;

/**
 * @author suren
 * 接口名必须以MXBean结尾
 */
public interface ITestHelloMXBean
{
	public void hello();

	public String getName();
}

[/codesyntax]

  • 用于发布服务的接口实现类TestHello.java

[codesyntax lang="java" lines="normal"]

package org.suren.littlebird;

/**
 * @author suren
 */
public class TestHello implements ITestHelloMXBean
{

	@Override
	public void hello()
	{
		System.out.println("impl hello");
	}

	@Override
	public String getName()
	{
		return "test get name";
	}

}

[/codesyntax]

  • 服务端测试类JmxServerTest.java

[codesyntax lang="java" lines="normal"]

package org.suren.littlebird;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Map;

import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

/**
 * @author suren
 *
 */
public class JmxServerTest {

    private static final String DOMAIN    = "suren";
    //用jconsole连接的话,会在“MBean”选项卡中多出来下面包名定义的一个节点
    private static final String PACKAGE = "org.suren.littlebird:type=";

    public static void main(String args[]) throws Exception
    {
        LocateRegistry.createRegistry(5006); //用于远程连接的端口
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();

        //注册一个可供调用的Bean对象
        TestHello testHello = new TestHello();
        ObjectName testHelloObjName = new ObjectName(PACKAGE + "TestHello");
        server.registerMBean(testHello, testHelloObjName);

        //注册一个可供远程连接的Bean对象
        JMXServiceURL serverUrl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://127.0.0.1:5006/"+DOMAIN);
        Map<String, String> env = new HashMap<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
        JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(serverUrl,env, server);
        server.registerMBean(connectorServer, new ObjectName(PACKAGE + "JMXConnectorServer"));

        //启动服务,这个start动作也可以通过jconsole来调用
        connectorServer.start();
    }
}

[/codesyntax]

  • 用于测试服务连接的客户端类JmxClientTest.java

[codesyntax lang="java" lines="normal"]

package org.suren.littlebird;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

/**
 * @author suren
 *
 */
public class JmxClientTest
{

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception
    {
        String hostName = "127.0.0.1"; //发布JMX服务的地址
        int portNum = 5006; //发布服务的端口

        JMXServiceURL u = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://"
                + hostName + ":" + portNum + "/suren");

        Map<String, Object> auth = new HashMap<String, Object>();
        //认证所需要的用户信息
        auth.put(JMXConnector.CREDENTIALS, new String[]{ "controlRole", "123" });

        JMXConnector jmxConnector = JMXConnectorFactory.connect(u, auth);
        MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();

        Set<ObjectInstance> beans = connection.queryMBeans(null, null);
        for(ObjectInstance objInstance : beans)
        {
            ObjectName mBeanName = objInstance.getObjectName();
            MBeanInfo mbeanInfo = connection.getMBeanInfo(mBeanName);

            System.out.println(Arrays.toString(mbeanInfo.getOperations()));
        }
    }
}

[/codesyntax] tomcat对我发布的可能是jmxrmi,要访问的uri为service:jmx:rmi:///jndi/rmi://localhost:5006/jmxrmi

  • Java认证配置

找到配置文件:$JAVA_HOME\jre\lib\management\jmxremote.password 添加如下配置: suren suren 然后修改jmxremote.password的权限为其他用户没有权限,chmod 700 jmxremote.password 找到配置文件:$JAVA_HOME\jre\lib\management\jmxremote.access suren   readwrite \ create javax.management.monitor.*,javax.management.timer.* \ unregister

  • 启动远程服务

如果要通过远程(IP地址+端口)来访问的话,需要在运行时加入以下参数(如何添加参数可以在本站搜索): -Dcom.sun.management.jmxremote.port=5006 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Djava.rmi.server.hostname=10.0.32.35

时间: 2024-08-27 08:40:54

Java管理扩展JMX之HelloWord篇的相关文章

01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序

 1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 二 开发 三 性能调优 WLS(Weblogic Server) Weblogic 12c新特性是加入了云支持 2 集群的好处:失败迁移和负载均衡. 3 分布式系统 分布式系统将工作划分到几个独立的模块中. 单个模块出现故障对整个系统的影响较小,这使得分布式系统具有更高的: ----可用性 ----

java字符串转算术表达式(进阶篇)

今天我们要将前两篇的随笔总结一下,用面向对象的思想封装一下,使它能够更容易的扩展. 首先我们要设计一个类,让他能够同时表示操作符和操作数 public enum OperationType { /** * 操作值 */ VALUE, /** * 操作符 */ SYMBOL; } 这里的操作数不是我们设计的问题所在,主要是操作符,我们操作符设计成这样 flag():操作符的指定标识 priority():操作符的优先级 numOfSymbol():操作符的优先级操作符的优先级 operation(

.NET C#到Java没那么难,Servlet篇

前言 .NET C#到Java没那么难,都是面向对向的语言,而且语法还是相似的,先对比一下开发环境,再到Servlet,再到MVC,都是一样一样的,只是JAVA的配制项比较多而已,只要配好一个,后面都是copy,简直so easy,而且用myeclipse可以省一些配制 Java与.NET的区别不在它们的本身,最大的区别在于他们背后的力量,相信大家都能感觉得到,我就不多说. 目录 一..NET C#到Java没那么难,开发环境篇 二..NET C#到Java没那么难,Servlet篇 三..NE

跟着阿里p7一起学java高并发 - 第18天:玩转java线程池,这一篇就够了

java中的线程池,这一篇就够了 java高并发系列第18篇文章. 本文主要内容 什么是线程池 线程池实现原理 线程池中常见的各种队列 自定义线程创建的工厂 常见的饱和策略 自定义饱和策略 线程池中两种关闭方法有何不同 扩展线程池 合理地配置线程池 线程池中线程数量的配置 什么是线程池 大家用jdbc操作过数据库应该知道,操作数据库需要和数据库建立连接,拿到连接之后才能操作数据库,用完之后销毁.数据库连接的创建和销毁其实是比较耗时的,真正和业务相关的操作耗时是比较短的.每个数据库操作之前都需要创

了解Java密码扩展的基础

  了解Java密码扩展的基础     Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,基本上,他是由一些包构成的,这些包形成了一个框架并实现了一些加密,密钥生成算法和协议,消息认证码等算法,这篇文章将想你介绍JCE的安装和使用.    值得注意的是,尽管JCE是JDK1.4的核心包的一部分,我们将首先用JDK1.2及高一点的版本向你演示一下如何安装配置JCE(静态安装).稍后,将向你介绍如何在不安装的情况下使用JCE(动态安装)

使用Visual Studio Code开发和调试Java Burp扩展

几天前,我发布了Bug Diaries Burp扩展.这是一个Burp扩展程序,使社区(免费)版 Burp 拥有相似的issue功能 .由于某些原因,现在决定用Java重写.这是我学习切换到Java系列文章的第一部分. 本部分讨论如何设置环境以使用Visual Studio Code进行开发.诸如自动完成,Gradle构建以及最重要的调试之类的事情. 克隆存储库可以跳过博客中的某些步骤.如果不熟悉Gradle和Burp开发,我还是建议自己做一遍,克隆以下存储库: https://github.c

JAVA技术专题综述之线程篇(1)

本文详细介绍JAVA技术专题综述之线程篇 编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:synchronized 本文将对以上内容进行讲解. 一:run()和start() 示例1: public cla ThreadTest extends Thread{public void run(){for(int i=0;i<10;i++){Syste

使用Java管理千台规模Linux服务器_入门

http://www.oschina.net/code/snippet_222919_11734 代码分享 当前位置: 代码分享 » Java  » 网络编程 搜 索 [饶过] 使用Java管理千台规模Linux服务器_入门 rgone 发布于 2012年07月09日 10时, 24评/2769阅 分享到:  收藏 +43 踩顶0 前东家是一家游戏公司,老板很好,当时工作也留下了很多自己原创的管理脚本.现在分享一下在办公环境使用Java.Jsch登录VPN管理Linux的脚本(此处实现JAVA调

Java入门到精通——调错篇之Spring2.5利用aspect实现AOP时报错: error at ::0 can&#39;t find referenced pointcut XXX

一.问题描述及原因. 利用Aspect注解实现AOP的时候出现了error at ::0 can't find referenced pointcut XXX.一看我以为注解写错了,结果通过查询相关资料是因为Spring2.5与中的aspectjweaver.jar 和aspectjrt.jar这两个jar包与JDK1.7不匹配. org.springframework.beans.factory.BeanCreationException: Error creating bean with n