RMI是实现将服务暴露给远程的一种手段,通过RMI可以实现应用的跨服务器,跨JVM的方法活对象的调用。
[b]首先实现RMI服务器端[/b]
创建远程方法调用参数类
package com.spring.pojo;
import java.io.Serializable;
/**
* 该类主要用于RMI参数的传递
* @author zhy
*
*/
public class PersonVo implements Serializable {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
然后创建远程访问接口,该接口用于导出远程服务
package com.spring.inter;
import com.spring.pojo.PersonVo;
/**
* 定义远程访问接口,供导出远程服务使用
* @author zhy
*
*/
public interface ILogPersion {
public Object getPersion(PersonVo persionVo);
}
接着创建远程接口实现,用于完成真正业务逻辑
package com.spring.inter.imp;
import com.spring.inter.ILogPersion;
import com.spring.pojo.PersonVo;
public class LogPersion implements ILogPersion {
public Object getPersion(PersonVo persionVo) {
return persionVo;
}
}
最后完成服务器端远程spring文件配置
<!-- 配置远程服务开始 -->
<bean id="logPerson" class="com.spring.inter.imp.LogPersion"/>
<bean id="logPersionService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- 指定serviceName,同客户端访问 -->
<property name="serviceName">
<value>LogPerson</value>
</property>
<!-- 注册真正的service实现到代理javaBean中 -->
<property name="service">
<ref bean="logPerson"/>
</property>
<!-- 指定服务实现的接口-->
<property name="serviceInterface">
<value>com.spring.inter.ILogPersion</value>
</property>
<!-- 避免与默认RMI端口冲突,修改端口 -->
<property name="registryPort">
<value>1200</value>
</property>
</bean>
总结服务器端:服务器端之所以不需要实现Remote接口等等,就是依赖于spring配置文件中的RmiServiceExporter,RmiServiceExporter将烦琐的RMI服务器端操作进行了封装。
开发spring RMI客户端
首先将服务器端的RMI 参数类和业务接口拷贝到调用应用中
即将PersonVo和ILogPersion拷贝过来
然后完成调用端spring文件的配置
<bean id="LogPerson" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl">
<value>rmi://localhost:1200/LogPerson</value>
</property>
<property name="serviceInterface">
<value>com.spring.inter.ILogPersion</value>
</property>
</bean>
最后创建mian方法进行调用
public static void main(String[] args) {
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
PersonVo vo = new PersonVo();
vo.setFirstName("z");
vo.setLastName("hy");
ILogPersion person = (ILogPersion)factory.getBean("LogPerson");
System.out.println( ((PersonVo)person.getPersion(vo)).getFirstName());
}
RMI的缺点:如果网络中存在防火墙,则RMI无能为力了,而且RMI要求必须是用java实现的。
[b]首先实现RMI服务器端[/b]
创建远程方法调用参数类
package com.spring.pojo;
import java.io.Serializable;
/**
* 该类主要用于RMI参数的传递
* @author zhy
*
*/
public class PersonVo implements Serializable {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
然后创建远程访问接口,该接口用于导出远程服务
package com.spring.inter;
import com.spring.pojo.PersonVo;
/**
* 定义远程访问接口,供导出远程服务使用
* @author zhy
*
*/
public interface ILogPersion {
public Object getPersion(PersonVo persionVo);
}
接着创建远程接口实现,用于完成真正业务逻辑
package com.spring.inter.imp;
import com.spring.inter.ILogPersion;
import com.spring.pojo.PersonVo;
public class LogPersion implements ILogPersion {
public Object getPersion(PersonVo persionVo) {
return persionVo;
}
}
最后完成服务器端远程spring文件配置
<!-- 配置远程服务开始 -->
<bean id="logPerson" class="com.spring.inter.imp.LogPersion"/>
<bean id="logPersionService" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- 指定serviceName,同客户端访问 -->
<property name="serviceName">
<value>LogPerson</value>
</property>
<!-- 注册真正的service实现到代理javaBean中 -->
<property name="service">
<ref bean="logPerson"/>
</property>
<!-- 指定服务实现的接口-->
<property name="serviceInterface">
<value>com.spring.inter.ILogPersion</value>
</property>
<!-- 避免与默认RMI端口冲突,修改端口 -->
<property name="registryPort">
<value>1200</value>
</property>
</bean>
总结服务器端:服务器端之所以不需要实现Remote接口等等,就是依赖于spring配置文件中的RmiServiceExporter,RmiServiceExporter将烦琐的RMI服务器端操作进行了封装。
开发spring RMI客户端
首先将服务器端的RMI 参数类和业务接口拷贝到调用应用中
即将PersonVo和ILogPersion拷贝过来
然后完成调用端spring文件的配置
<bean id="LogPerson" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl">
<value>rmi://localhost:1200/LogPerson</value>
</property>
<property name="serviceInterface">
<value>com.spring.inter.ILogPersion</value>
</property>
</bean>
最后创建mian方法进行调用
public static void main(String[] args) {
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory factory = new XmlBeanFactory(resource);
PersonVo vo = new PersonVo();
vo.setFirstName("z");
vo.setLastName("hy");
ILogPersion person = (ILogPersion)factory.getBean("LogPerson");
System.out.println( ((PersonVo)person.getPersion(vo)).getFirstName());
}
RMI的缺点:如果网络中存在防火墙,则RMI无能为力了,而且RMI要求必须是用java实现的。