很早以前就接觸到了JMX,最近又要用到它。但是啟動服務(wù),遠(yuǎn)程調(diào)用的關(guān)鍵代碼一時還真想不起來。上網(wǎng)google一圈還是沒找到答案。最終還是本人反復(fù)調(diào)試,才搞定。現(xiàn)貢獻(xiàn)源碼如下:
JMX Server實現(xiàn):

public class ToolsJMXServer
{



public void startUp()
{

try
{
//加載配置
InputStream is = this.getClass().getClassLoader().getResourceAsStream(
"com/shrcn/jmx/RegistBeanInfo.properties");

if(is.available()>0)
{
proCfg.load(is);
}

if(proCfg.contains(KEY_PORT))
{
RMI_PORT = Integer.parseInt(proCfg.getProperty(KEY_PORT));
}
//啟動命名服務(wù)
LocateRegistry.createRegistry(RMI_PORT);
registerMBeans();
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:" + RMI_PORT +
"/" + JNDI_NAME);
JMXConnectorServer cs = JMXConnectorServerFactory
.newJMXConnectorServer(url, // url
null, // environment map
server); // MBeanServer
//啟動JMXServer
cs.start();

} catch (RemoteException e)
{
e.printStackTrace();

} catch (MalformedURLException e)
{
e.printStackTrace();

} catch (IOException e)
{
e.printStackTrace();
}
}

private void registerMBeans()
{

try
{
Iterator<Entry<Object, Object>> it = proCfg.entrySet().iterator();

while(it.hasNext())
{
Entry<Object, Object> entry = it.next();
String beanName = (String)entry.getKey();
if(KEY_PORT.equals(beanName))
continue;
String clazz = (String)entry.getValue();
ObjectName on = new ObjectName(DOMAIN + ":" + KEY + "=" + beanName);
Class<?> cl = Class.forName(clazz);
Object obj = cl.newInstance();
server.registerMBean(obj, on);
}

} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}


}

JMX客戶端實現(xiàn):

public class MBeanCaller
{


public static Object invokeRemote(String host, int port, ObjectName objectName,
String methodName, Object[] params, String[] signature)

throws RemoteException
{
JMXConnector connector = null;
MBeanServerConnection connection = null;

try
{
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://" + host +
":" + port + "/" + ToolsJMXServer.JNDI_NAME);
connector = JMXConnectorFactory.connect(url);
connection = connector.getMBeanServerConnection();
return connection.invoke(objectName, methodName, params, signature);

} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();

} finally
{

try
{
connector.close();

} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}


}

雖然代碼簡練,但很實用,希望對各位讀者有益。[源碼]
posted on 2008-12-23 21:08
遠(yuǎn)帆 閱讀(415)
評論(0) 編輯 收藏 所屬分類:
Java