一、概述
传统的创建RMI服务,会涉及如下几个步骤:
1、编写远程服务接口,该接口必须继承 java.rmi.Remote
接口,方法必须抛出 java.rmi.RemoteException 异常;
2、编写远程接口实现类,该实现类必须继承
java.rmi.server.UnicastRemoteObject 类;
3、运行RMI编译器(rmic),创建客户端 stub 类和服务端
skeleton 类;
4、启动一个RMI注册表,以便驻留这些服务;
5、在RMI注册表中注册服务;
二、在Spring中配置RMI服务
1、服务接口
1 package com.cnblogs.javalouvre.service;
2
3 public interface GreetService {
4
5 String sayHello(String name);
6
7 }
2、服务实现类
1 package com.cnblogs.javalouvre.service;
2
3 public class GreetServiceImpl implements GreetService {
4
5 @Override
6 public String sayHello(String name) {
7 return "Hello " + name;
8 }
9
10 }
3、Spring文件配置
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
6
7 <bean id="greetService" class="com.cnblogs.javalouvre.service.GreetServiceImpl" />
8
9 <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
10 <property name="serviceName" value="GreetService" />
11 <property name="service" ref="greetService" />
12 <property name="serviceInterface" value="com.cnblogs.javalouvre.service.GreetService" />
13 <property name="registryPort" value="1199"/>
14 </bean>
15
16 </beans>
4、启动服务
1 package com.cnblogs.javalouvre.server;
2
3 import org.springframework.context.support.ClassPathXmlApplicationContext;
4
5 public class Server {
6
7 public static void main(String[] args) {
8 new ClassPathXmlApplicationContext("applicationContext.xml");
9 }
10
11 }
说明:如果使用传统的RMI来发布服务,在服务实现类中所有方法都得抛出
java.rmi.RemoteException 异常。但如果使用Spring的
org.springframework.remoting.rmi.RmiServiceExporter 将该类转化为 RMI 服务,那么实现将简单的多。
RmiServiceExporter 可以将任何一个 Spring 管理的Bean发布为一个 RMI
服务,默认情况下,RmiServiceExporter会尝试将一个RMI注册表绑定到本机的1099端口。如果在这个端口没有发现RMI注册表,RmiServiceExporter将重新启动一个注册表。如果希望将某个
RMI 注册表绑定到不同的端口或主机,可以通过 registryPort和registryHost属性指定。
三、装配RMI服务
1、接口同上
2、配置Spring
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
6
7 <bean id="greetService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
8 <property name="serviceUrl" value="rmi://10.108.1.138:1199/GreetService" />
9 <property name="serviceInterface" value="com.cnblogs.javalouvre.service.GreetService" />
10 </bean>
11
12 </beans>
3、客户端调用
1 package com.cnblogs.javalouvre.client;
2
3 import org.springframework.context.ApplicationContext;
4 import org.springframework.context.support.ClassPathXmlApplicationContext;
5
6 import com.cnblogs.javalouvre.service.GreetService;
7
8 public class Client {
9
10 public static void main(String[] args) {
11 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
12 GreetService service = context.getBean("greetService", GreetService.class);
13 System.out.println(service.sayHello("Jobs"));
14 }
15
16 }
说明:Spring的
org.springframework.remoting.rmi.RmiProxyFactoryBean 是一个工厂Bean,
该Bean可以为RMI服务创建代理。