首页 > 代码库 > Spring配置RMI

Spring配置RMI

一、概述

    传统的创建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服务创建代理。