自己依照已有的源代码,主要是在JMX框架下,实现了RMI远程调用的一个简单的例子,主要是为了验证RMI调用时文件的配置情况。
主要有forPlay类及对应的MBean,Server端以及client端,其中,clint端是和其他文件异地配置的,在同一台机子上更没问题了。通过RMI远程连接,我们可以实现一个瘦客户端的,即主要的MBean是放在Server端,客户端使用相应的类时,只需要通过RMI调用就行了,另外,MBean只需和服务器同包放置或者服务器能够找到的位置,无须显式的注册,这是我实现这个程序的主要目的。
server端的源代码和JMX下RMI远程调用的入门(环境变量的设置)里面的Server.java文件是一样的,涉及到环境变量以及如何运行,这篇文章里也有详细介绍。这里只给出我今天写的一段代码
整个程序一共有四个文件
forReplay.java、forReplayMBean.java、Client.java以及前面说到的Server.java,这里给出前三个文件的代码:
***********************************************************
forReplay.java
***************************************
public class forReplay
implements forReplayMBean{
private String State="待调用";
public void play(){
System.out.println("play函数调用成功!");
}
public String getState() {
return State;
}
public void setState(String s) {
State=s;
}
}
***********************************************************
***********************************************************
forReplayMBean.java
***************************************
public interface forReplayMBean {
public String getState();
public void setState(String s);
public void play();
}
***********************************************************
***********************************************************
Client.java
***************************************
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Client {
public static void main(String[] args) {
try {
// 创建RMI连接客户端到RMI连接服务器
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
// 获得一个MBean服务器连接
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
//创建一个forPlay类
ObjectName mbeanName = new ObjectName("chengang:name=forReplay");
mbsc.createMBean("forReplay", mbeanName, null, null);
System.out.println("\nMBean数量为" + mbsc.getMBeanCount());// 获得Mbean的数量
mbsc.invoke(mbeanName,"play", null, null);//调用forPlay类中的play()函数
Thread.sleep(2000);//挂起2000毫秒,等待服务器反应.
mbsc.unregisterMBean(mbeanName); //注销MBean的注册,不是必要的
jmxc.close();// 关闭连接,不是必要的
} catch (Exception e) {
e.printStackTrace();
}
}
}
***********************************************************
***********************************************************