package com.pachira.oamp.jmxServer;
import java.util.HashMap;
import java.util.Map;
import javax.management.JMX;
import javax.management.MBeanServer;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerFactory;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.apache.cxf.common.util.StringUtils;
import com.pachira.oamp.utils.ConfigUtils;
import com.pachira.utils.SrvLogger;
public class ClientMBServerManage {
private static MBeanServer server=null;
private static ClientMBServerManage instance=null;
private static MBeanServerConnection mbsc=null;
private ClientMBServerManage(){
server=getLocalMBServer();
mbsc=this.getRemoteMBConn();
}
public static ClientMBServerManage getInstance(){
if(instance==null){
synchronized (ClientMBServerManage.class) {
if (instance == null) {
instance = new ClientMBServerManage();
}
}
}
return instance;
}
/**
* 注册MBean
* @param obj
* @param className
* @param name
*/
public void register(Object obj,String className,String name){
try {
ObjectName objectName = getObjectName(name);
this.registerLocal(obj, objectName);
this.registerRemote(className, objectName);
} catch(Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
}
}
/**
* 根据名称注销远程的MBean
*
* @param name
*/
public void unRegisterRemote(String name){
try {
if(mbsc==null){
return ;
}
if(StringUtils.isEmpty(name)){
name="*";
}
ObjectName objectName =getObjectName(name);
for (ObjectInstance object : mbsc.queryMBeans(objectName, null)) {//服务器上的所有MBean
ObjectName on=object.getObjectName();
if(mbsc.isRegistered(on)){
mbsc.unregisterMBean(on);
}
}
} catch(Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
}
}
/**
* 获取远程的对象
* @param name
* @param cla
* @return
*/
@SuppressWarnings("unchecked")
public Object getRemoteMBean(String name,Class cla){
ObjectName objectName = getObjectName(name);
try {
if(mbsc!=null&&objectName!=null&&mbsc.isRegistered(objectName)){
return JMX.newMBeanProxy(mbsc, objectName,cla);
}
} catch (Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to getRemoteMBean", e);
}
return null;
}
/**
* 执行远程方法
* @param name
* @param operationName
* @param params
* @param signature
*/
public void invokeRemote(String name,String operationName,Object[] params,String[] signature){
try {
if(mbsc==null){
return ;
}
ObjectName objectName=this.getObjectName(name);
if(StringUtils.isEmpty(name)||StringUtils.isEmpty(operationName)||objectName==null){
return ;
}
mbsc.invoke(objectName, operationName, params, signature);
} catch (Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to invokeRemote", e);
}
}
/**
* 本地注册MBean,没有则创建
* @param obj
* @param objectName
*/
private void registerLocal(Object obj,ObjectName objectName){
if(obj==null||objectName==null){
return ;
}
try {
if(!server.isRegistered(objectName)){
server.registerMBean(obj, objectName);
}
} catch(Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
}
}
/**
* 根据name获取ObjectName
* @param name
* @return
*/
private ObjectName getObjectName(String name){
if(StringUtils.isEmpty(name)){
return null;
}
String ip=ConfigUtils.getInstance().getOampConfig("IP");
ObjectName objectName=null;
try {
objectName = new ObjectName("QianYu:type=oamp,name=" +ip+name);
} catch (Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to get ObjectName", e);
}
return objectName;
}
/**
* 远程注册MBean,没有则创建
* @param className
* @param objectName
*/
private void registerRemote(String className,ObjectName objectName){
if(StringUtils.isEmpty(className)||objectName==null||mbsc==null){
return ;
}
try {
if(!mbsc.isRegistered(objectName)){
mbsc.createMBean(className, objectName,null,null);
}
} catch(Exception e) {
// e.printStackTrace();
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to register MBean", e);
}
}
/**
* 获取本地MBeanServer
* @return
*/
private MBeanServer getLocalMBServer(){
MBeanServer mBeanServer = null;
if (MBeanServerFactory.findMBeanServer(null).size() > 0) {
mBeanServer =(MBeanServer) MBeanServerFactory.findMBeanServer(null).get(0);
} else {
mBeanServer = MBeanServerFactory.createMBeanServer();
}
return mBeanServer;
}
/**
* 获取远程MBeanServerConnection
* @return
*/
private MBeanServerConnection getRemoteMBConn(){
// provide a valid username and password (e.g., via program arguments)
String user = "monitorRole";
String pw = "password";
// place the username and password in a string array of credentials that
// can be used when making the connection to the remote JMX agent
String[] credentials = new String[] { user, pw };
// the string array of credentials is placed in a map keyed against the
// well-defined credentials identifier string
Map<String, String[]> props = new HashMap<String, String[]>();
props.put("jmx.remote.credentials", credentials);
// supply the map of credentials to the connect call
JMXServiceURL address;
MBeanServerConnection mbs=null;
try {
address = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(address, props);
mbs= connector.getMBeanServerConnection();
connector.connect();
} catch (Exception e) {
SrvLogger.error("oamp", ClientMBServerManage.class, "Fail to getRemoteMBConn", e);
}
return mbs;
}
}
分享到:
相关推荐
类加载的过程遵循委派模型,每个类加载器实例都有一个父类加载器。当需要加载类时,先由父类加载器尝试,如果找不到则递归到更高级别的父类加载器,直到到达根类加载器(Bootstrap ClassLoader)。这种机制确保了...
MXBean是JMX中的一个特殊概念,它是标准MBean的扩展,旨在简化跨JVM边界传递数据的过程。MXBean接口定义了特定的命名规则和序列化机制,确保数据能够在不同的Java环境中安全地传输。MXBean的使用通常涉及到JConsole...
这篇博客文章(可以通过给定的链接访问)可能是介绍JMX基础知识的一个很好的起点。虽然具体的博客内容未在描述中给出,但我们可以根据JMX的一般知识来探讨其关键概念和用法。 首先,JMX的核心组成部分包括MBeans...
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、操作系统和网络设备。它提供了一种统一的方式来创建、配置、查询和控制管理对象,使得开发者可以轻松地将管理功能集成到...
Java Management Extensions(JMX)是Java平台上的一个标准技术,用于管理和监控应用程序、系统和服务。在"jmx_examples.zip_jmx_examples"这个压缩包中,我们可能会找到一系列示例代码,这些代码展示了如何利用JMX...
原文链接:https://blog.csdn.net/m0_37814112/article/details/118852474?spm=1001.2014.3001.5501 说明:包括jmx_prometheus_javaagent-0.16.1.jar和prometheus-jmx-config.yaml
此时,JMX作为一种标准的Java平台管理系统接口,提供了统一的管理视图,使得管理员能够实时监控和调整Coherence集群的状态,从而实现性能优化和故障排查。 #### 启用JMX管理的配置 为了在Coherence集群中启用JMX...
JMX (Java Management Extensions) 技术作为 Java 平台上的一个重要组成部分,主要用于监控和管理系统资源。随着 Java 的广泛应用,JMX 已经成为 JDK 标准的一部分,并且在 1.4 版本中得到了进一步的增强和发展。...
jmx-agent 使用 JVM Agent 接口链接到任何 JVM,并导出 JMX Server! 安装 通过在启动 Java 进程时提供单个启动选项 -javaagent 来安装此代理。 java -javaagent:JmxAgent.jar=port=5678,host=localhost JmxAgent...
NULL 博文链接:https://jonerxq.iteye.com/blog/1990872
Java Management Extensions(JMX)是Java平台上的一个标准组件,用于构建和管理应用程序、设备和服务的管理系统。JMX提供了一种灵活的框架,允许开发者创建、注册和管理名为Managed Beans(MBeans)的对象,这些...
JMX(Java Management Extensions)技术是Java平台上的一个重要组成部分,用于管理和监控Java应用程序及运行环境。随着JMX技术的发展,其最新版本1.4已经成为JDK标准的一部分。这一规范的发布对于Java开发者来说具有...
NULL 博文链接:https://hotboy10001000.iteye.com/blog/865118
标题“jmx_tristan_notification”涉及的是Java管理扩展(Java Management Extensions, JMX)技术,一个用于管理和监控Java应用程序的框架。在这个特定的上下文中,它可能与博主Tristan分享的一篇博客文章有关,该...
NULL 博文链接:https://90haofang-163-com.iteye.com/blog/1902211
"谷歌浏览器使用blazemeter插件录制jmx脚本" 本文将详细介绍如何使用谷歌浏览器中的blazemeter插件录制jmx脚本,包括插件的下载和安装、录制jmx脚本的步骤,以及jmx脚本的导出和使用。 首先,需要下载blazemeter...
博文链接:https://aga.iteye.com/blog/209568
博文链接:https://hintcnuie.iteye.com/blog/244247
在Maven项目中,`log4j`是一个广泛使用的日志记录框架,它提供灵活的日志配置和多种输出格式。当集成log4j时,有时需要配置MBeans来监控日志级别、日志输出等信息,这就需要用到JMX。因此,`log4j`的配置可能会依赖...