JMX 使用(原创)

本文地址:
项目需要使用MBEAN来读取XML配置,如果校验失败,则直接让相关的app部署不起来。这是背景。
由此所需考虑的东西:
1. 如何让MBEAN一启动就去读配置?
2. 如果读取配置错误或者读到后校验失败,如何让指定的包部署不起来而不是关闭Jboss(因为还有其他包不应该受到影响)?

问题1很好解决,直接创建Start方法,并在start方法中去调读取配置的方法。Mbean在初始化的时候默认会执行start方法。
问题2就涉及了几个技术,这里分解开来记录。

1. 调用JMX的MBEAN (local/remote)
调用Mbean之前,必须要拿到MBeanServer。这里也就是local和remote的区别。
local的话,直接用

MBeanServer server = ManagementFactory.getPlatformMBeanServer();

remote的话,可以用

String serverURL = "service:jmx:rmi:///jndi/rmi://localhost:1090/jmxrmi";
String username = null;
String password = null;

Map env = new HashMap();
if (username != null && password != null) {
String[] creds = new String[2];
creds[0] = username;
creds[1] = password;
env.put(JMXConnector.CREDENTIALS, creds);
}
JMXServiceURL url = new JMXServiceURL(serverURL);
JMXConnector jmxc = JMXConnectorFactory.connect(url, env);
// Remember to call jmxc.close() when you are done with server
// connection.
MBeanServerConnection server = jmxc.getMBeanServerConnection();

红色部分需要用真实的用户名密码替代,一般可以读取配置拿到。

在拿到MBeanServer以后,后面剩下部分就一样了。调server.invoke方法。

ObjectName mName = new ObjectName("jboss.system:service=MainDeployer");

String [] params = {"file://C:/Tools/jboss-6.1.0.Final/server/default/deploy/TestSarEar.ear"};

String[] unDeploysig = { String.class.getName() };

server.invoke(mbeanName, "undeploy", params, unDeploysig);

这里ObjectName mName 是你所想要用的Mbean的服务名。一般是 [包名]:service = [接口名]这种格式。
例子中给出的是调用MainDeployer这个Mbean, 这里可以找到这个类定义的方法,根据不同方法的不同参数和返回值来填后面两个参数,例如这里调用的是
void undeploy(String urlspec); 
那么params就是urlspec,即你想要undeploy的包的路径; unDeploysig就是该方法的参数类型,即java.lang.String。

如此,对于我们自己的Mbean :   com.test.TestConfigMbean的 
Parameters loadPara();
我们可以这样调:
String[] sig = {Parameters.class.getName()};
server.invoke(new ObjectName("com.test:service= TestConfigMbean"), "loadPara", sig);

2. undeploy需要传入你想要undeploy的包的地址,怎么解决呢?
最初的考虑是能不能从系统中找到所有部署包的封装类,然后拿到地址,https://community.jboss.org/wiki/JSR88Client 这里有些东西可以拿来参考。
后来想到一个简单的办法,就是在我们打的包的META-INF下面添加一个xml文件,用读resource的方法读到该xml所在包的路径。
即:
String path = this.getClass().getClassLoader().getResource("META-INF/test-meta-inf.xml").getPath();
然后把这个path传入invoke方法:
String [] params = {path};

3. 通过命令行来执行方法
JBOSS提供了 Twiddle文件在它的bin目录下,方便直接调用mbean,其原理其实就是server.invoke()。
所以用法也很简单,
twiddle.sh invoke "jboss.system:service=MainDeployer" undeploy file:///path/to/ProjectEAR.ear
可以参考:
 http://stackoverflow.com/questions/3048435/how-do-i-stop-start-ejb-apps-in-jboss-6-0-from-the-command-line 
 https://community.jboss.org/wiki/Twiddle 

用twiddle也可以查询JBoss当前的状态是否完全启动:
twiddle get "jboss.system:type=Server" Started
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值