Spring RMI
使用Spring的RMI支持,你可以通过RMI基础设施透明的暴露你的服务。设置好Spring的RMI支持后,你会看到一个和远程EJB接口类似的配置,只是没有对安全上下文传递和远程事务传递的标准支持。当使用RMI调用器时,Spring对这些额外的调用上下文提供了钩子,你可以在此插入安全框架或者定制的安全证书。
1.使用RmiServiceExporter暴露服务
使用RmiServiceExporter,我们可以把AccountService对象的接口暴露成RMI对象。可以使用 RmiProxyFactoryBean 或者在传统RMI服务中使用普通RMI来访问该接口。RmiServiceExporter 显式地支持使用RMI调用器暴露任何非RMI的服务。当然,我们首先需要在Spring容器中设置我们的服务:
<bean id="accountService" class="example.AccountServiceImpl">
public class SimpleObject { private AccountService accountService; public void setAccountService(AccountService accountService) { this.accountService = accountService; } }
为了把服务连接到客户端上,我们将创建一个单独的Spring容器,包含这个简单对象和链接配置位的服务:
package com.ipi.rmi.test.service; public interface HelloWorld { public String helloWorld(); public String sayHelloToSomeBody(String someBodyName); }
2)HelloWorldImpl.java
package com.ipi.rmi.test.service.impl; import com.ipi.rmi.test.service.HelloWorld; public class HelloWorldImpl implements HelloWorld { @Override public String helloWorld() { return "Hello World!"; } @Override public String sayHelloToSomeBody(String someBodyName) { return "Hello World!" + someBodyName; } }
3)Spring配置文件
package com.ipi.rmi.test.server; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class SpringRmiServer { public static void main(String[] args) { //初始化工作只能运行一次;运行多次的话,会启动多个服务 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); System.out.println("Spring rmi 测试程序服务已启动"); } }
服务器端程序如附件中的SpringRmiServer.rar
4 客户端配置与开发
1) 将服务端的接口进行打包(注:不需要实现类,只是客户端访问服务端的一个存根)
2) 配置spring
a.指定访问服务的地址
b.指定服务的接口
1)为了在客户端有访问服务端的一个存根,所以客户端也应该有一个HelloWorld接口
2)客户端Spring配置文件如下所示:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
- <!--客户端-->
- <bean id="helloWorld" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
- <property name="serviceUrl" value="rmi://127.0.0.1:9999/helloWorldService"/>
- <property name="serviceInterface" value="com.ipi.rmi.test.service.HelloWorld"/>
- </bean>
- </beans>
客户端程序如附件中的SpringRmiClient.rar
需要注意的:1. 客户端必须要有实现类的接口(存根),这样才能访问后实现类的转型,引用与方法调用;
2.使用RMI时要注意开放防火墙相应端口;
3.RMI它使用 JRMP(Java Remote Messaging Protocol,Java 远程消息传递协议)作为其传输协议。当然,RMI 传输还涉及 Java 对象的序列化。
5.CORBA 和 RMI 的差异
CORBA 运行在 IIOP 协议之上;RMI 使用 JRMP。
CORBA 是独立于语言的;RMI 是纯粹 Java 到 Java 的。
RMI 使用 JNDI 定位远程对象;CORBA 使用 CosNaming。
RMI 会将对象序列化;CORBA 则不然。
注:IIOP(Internet Inter-ORB Protocol(互联网内部对象请求代理协议)),它是一个用于CORBA 2.0及兼容平台上的协议。用来在CORBA对象请求代理之间交流的协议。Java中使得程序可以和其他语言的CORBA实现互操作性的协议。
有关RMI-IIOP可以参看文章:
相关推荐
LychieFan 2007-06-08
GodLong 2011-06-09
agjllxchjy 2012-03-05
Bonbonwen 2011-11-17
LinuxCard 2012-10-10
XuNeely 2019-06-30
spring 2014-05-12
妖怪哪里跑 2014-03-13
lxfHaHaHa 2013-08-06
uk8692 2019-06-28
hanyujianke 2014-09-16
dlutbob 2010-06-01
RickyIT 2010-05-03
JESSIEfoo 2010-01-16
JESSIEfoo 2009-04-16
dananhai 2008-02-01