spring RMI

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的魅力啊

相关推荐