Spring整合RMI的原理

Spring整合RMI的原理

客户端的核心是RmiProxyFactoryBean,包含serviceURL属性和serviceInterface属性。

通过JRMP访问服务。JRMP JRMP:java remote method protocol,Java特有的,基于流的协议。

 

服务端暴露远程服务

RmiServiceExporter把任何Spring管理的Bean输出成一个RMI服务。通过把Bean包装在一个适配器类中工作。适配器类被绑定到RMI注册表中,并且将请求代理给服务类。

 

服务端

1 IHelloWorld.java POJO的接口

    public interface IHelloWorld {  
        public String helloWorld();  
      
        public String sayHelloToSomeBody(String someBodyName);  
    }  

 

 

2 HelloWorld.java POJO的实现

public class HelloWorld implements IHelloWorld {  
  
    @Override  
    public String helloWorld() {  
        return "Hello World!";  
    }  
  
    @Override  
    public String sayHelloToSomeBody(String someBodyName) {  
        return "Hello World!" + someBodyName;  
    }  
  
} 

 

3 spring配置文件rmi_server_context.xml

    <?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: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-2.0.xsd  
    http://www.springframework.org/schema/aop  
    http://www.springframework.org/schema/aop/spring-aop-2.0.xsd  
    http://www.springframework.org/schema/tx  
    http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
      
        <bean id="helloWorld" class="springapp.rmi.rmi.HelloWorld" />  
      
        <bean id="serviceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">  
            <property name="service" ref="helloWorld" />  
            <!-- 定义服务名 -->  
            <property name="serviceName" value="hello" />  
            <property name="serviceInterface" value="springapp.rmi.rmi.IHelloWorld" />  
            <property name="registryPort" value="8088" />  
        </bean>  
      
    </beans>  

 

4  服务端启动RMI的代码HelloHost.java

    public class HelloHost {  
        public static void main(String[] args) {  
            ApplicationContext ctx = new ClassPathXmlApplicationContext(  
                    "rmi_server_context.xml");  
            System.out.println("RMI服务伴随Spring的启动而启动了.....");  
        }  
    }  

  

客户端

1 配置文件rmi_client_context.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">  
        <bean id="helloWorld" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">  
            <property name="serviceUrl" value="rmi://10.87.40.141:8088/hello" />  
            <property name="serviceInterface" value="springapp.rmi.rmi.IHelloWorld" />  
        </bean>  
    </beans>  

 

2 客户端代码 HelloClient.java

    public class HelloClient {  
      
        public static void main(String[] args) throws RemoteException {  
            ApplicationContext ctx = new ClassPathXmlApplicationContext(  
                    "rmi_client_context.xml");  
            IHelloWorld hs = (IHelloWorld) ctx.getBean("helloWorld");  
            System.out.println(hs.helloWorld());  
            System.out.println(hs.sayHelloToSomeBody("Lavasoft"));  
        }  
      
    } 

 3 客户端复制服务端IHelloWorld.java的接口

    public interface IHelloWorld {  
        public String helloWorld();  
      
        public String sayHelloToSomeBody(String someBodyName);  
    }  

 jar

            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-asm</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-tx</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>${spring.version}</version>
            </dependency>

 

注意:rmi无法在中间添加F5进行访问
总结:客户端通过rmi进行远程访问服务端的接口方法
 

 

posted @ 2015-09-06 17:56  W&L  阅读(338)  评论(0)    收藏  举报