JMX的一个链接类


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;
}
}

要在 Bash 脚本中链接JMX,您可以使用以下步骤: 1. 使用 Java 命令启动您的 Java 应用程序,并启用 JMX。这可以通过设置系统属性来完成,例如: ``` java -Dcom.sun.management.jmxremote.port=9999 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ YourApp ``` 在上面的示例中,我们启用了 JMX,并将 JMX 端口设置为 9999,禁用了 SSL 和身份验证。 2. 使用 JMX 客户端库连接到应用程序。您可以使用 JMX 客户端库,例如 jmxterm 或 jmxsh,或使用编程语言中的 JMX API 连接到您的应用程序。例如,在 Bash 脚本中,您可以使用 JMXShell: ``` #!/bin/bash # connect to JMX jmxsh -l service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi ``` 在上面的示例中,我们使用 jmxsh 连接到 JMX 端口 9999。 3. 执行 JMX 操作。一旦您连接到应用程序,您就可以执行 JMX 操作,例如查看 MBean 属性或调用 MBean 操作。例如,在 Bash 脚本中,您可以使用 JMXShell 执行以下操作: ``` #!/bin/bash # connect to JMX jmxsh -l service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi # get the value of a MBean attribute get java.lang:type=Memory HeapMemoryUsage # invoke a MBean operation exec java.lang:type=Memory gc ``` 在上面的示例中,我们获取了名为 HeapMemoryUsage 的 MBean 属性的值,并调用了名为 gc 的 MBean 操作。 请注意,您需要确保您的应用程序启用了 JMX,并且您的脚本具有足够的权限来连接到 JMX 端口和执行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值