dlutbob 2010-06-01
Java开发者可以利用的远程技术有以下几种:
1.远程方法调用(RMI)
2.Caucho的Hessian和Burlap
3.Spring自己的HTTPinvoker
4.EJB
5.WebServices
一.RMI
它由5个包及3个应用工具组成
java.rmi组织客户端的RMI类、接口和异常
java.rmi.server组织服务器端的RMI类接口和异常
java.rmi.registry组织用于管理RMI命名服务的类
java.rmi.dgc组织用于管理分布式垃圾收集的类
java.rmi.activation组织用于实现按需激活的RMI服务的类
rmic编译器,它产生RMI使用的存根和框架以完成分布式通信
rmiregistry一个为RMI提供命名服务的服务器,这项服务把名字和对象关联在一起
rmid一个支持RMI激活框架的服务器
如果具体还不知道什么是RMI,可以参考这篇非常不错的文章《JavaRMI入门实战》
注意:
1)要把PerfectTime和PerfectTimeI类中的
System.setSecurityManager(newRMISecurityManager());注释掉(因为这需要配安全策略,比较麻烦)
2)还有在JDK5下,用rmic-d命令的话只会输出一个文件,因为JDK5对RMI进行了优化
接下来看看用spring对《JavaRMI入门实战》例子的简化
1.客户端的配置及代码
PerfectTimeI接口(不用继承java.rmi.Remote接口了,普通的POJO)
packagecom.open.rmi.ex2;
publicinterfacePerfectTimeI{
longgetPerfectTime();
}DisplayPerfectTime类(也是一个普通的类)
packagecom.open.rmi.ex2;
publicclassDisplayPerfectTime{
privatePerfectTimeIpf;
publicvoiddisplay(){
for(inti=0;i<10;i++){
System.out.println("PerfectTime:"+pf.getPerfectTime());
}
}
//省略了pf的get,set方法
}客户端配置bean_client.xml
<beans>
<!--客户端-->
<beanid="pf"class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<propertyname="serviceUrl"value="rmi://192.168.1.8:1099/perfect_time"/>
<propertyname="serviceInterface"value="com.open.rmi.ex2.PerfectTimeI"/>
</bean>
<beanid="test"class="com.open.rmi.ex2.DisplayPerfectTime">
<propertyname="pf"ref="pf"/>
</bean>
</beans>2.服务端的配置及代码
PerfectTime类(爽吧,简简单单的POJO)
packagecom.open.rmi.ex2;
publicclassPerfectTimeimplementsPerfectTimeI{
publiclonggetPerfectTime(){
returnSystem.currentTimeMillis();
}
}配置bean_server.xml
<beans>
<!--服务端:Spring读取完定义文件,在生成serviceExporter实例后,RMI服务就会启动-->
<beanid="serviceExporter"
class="org.springframework.remoting.rmi.RmiServiceExporter">
<propertyname="service"ref="pt"/>
<propertyname="serviceName"value="perfect_time"/>
<propertyname="serviceInterface"value="com.open.rmi.ex2.PerfectTimeI"/>
</bean>
<beanid="pt"class="com.open.rmi.ex2.PerfectTime"/>
</beans>3.测试代码
TestServer.java
packagecom.open.rmi.ex2;
importorg.springframework.beans.factory.BeanFactory;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassTestServer{
publicstaticvoidmain(String[]args){
BeanFactorybf=newClassPathXmlApplicationContext("bean_server.xml");
bf.getBean("serviceExporter");
}
}
TestClient.java
packagecom.open.rmi.ex2;
importorg.springframework.beans.factory.BeanFactory;
importorg.springframework.context.support.ClassPathXmlApplicationContext;
publicclassTestClient{
publicstaticvoidmain(String[]args){
BeanFactorybf=newClassPathXmlApplicationContext("bean_client.xml");
DisplayPerfectTimetest=(DisplayPerfectTime)bf.getBean("test");
test.display();
}
}
先运行TestServer,输出
RmiServiceExporter-CouldnotdetectRMIregistry-creatingnewone在运行TestClient就可以看到结果了
PerfectTime:1150125107468
PerfectTime:1150125107484
PerfectTime:1150125107484
看到没,你根本不用运行rmic-dG:\RMItest.PerfectTime,startrmiregistry。
这就是spring的魅力啊