SpringRMI遠程方法調用【原】


 

Spring為各種遠程訪問技術的集成提供了工具類。

該小段引用自 http://www.open-open.com/lib/view/open1408957290478.html

Spring遠程支持是由普通(Spring)POJO實現的,這使得開發具有遠程訪問功能的服務變得相當容易。目前,Spring支持四種遠程技術:

  • 遠程方法調用(RMI)。通過使用 RmiProxyFactoryBean 和 RmiServiceExporter,Spring同時支持傳統的RMI(使用 java.rmi.Remote接口和java.rmi.RemoteException)和通過RMI調用器實現的透明遠程調用(支持任何Java接口)。
  • Spring的HTTP調用器。Spring提供了一種特殊的允許通過HTTP進行Java串行化的遠程調用策略,支持任意Java接口(就像RMI調用器)。相對應的支持類是 HttpInvokerProxyFactoryBean和 HttpInvokerServiceExporter。
  • Hessian。通過 HessianProxyFactoryBean 和 HessianServiceExporter,可以使用Caucho提供的基於HTTP的輕量級二進制協議來透明地暴露服務。
  • Burlap。 Burlap是Caucho的另外一個子項目,可以作為Hessian基於XML的替代方案。Spring提供了諸如 BurlapProxyFactoryBean 和 BurlapServiceExporter 的支持類。
  • JAX RPC。Spring通過JAX-RPC為遠程Web服務提供支持。
  • JMS(待實現)。

遠程方法調用的優點

方便服務端與客戶端之間進行對象形式的調用,而不單純地只是調用字符串.

而如果參數之間交互只是單純地字符串,那么其實還不如用http的純post通信來得爽快.

 

相關下載

本項目用的是spring3.0.6相關jar.

項目源碼樣例 

git地址: https://git.oschina.net/KingBoBo/SpringRMI.git

 

項目結構

  • 紅色為服務端必要文件.
  • 綠色為客戶端必要文件.
  • 紫色為服務端和客戶端都必要的文件.

為了方便自測,我把服務端和客戶端都整合在一個項目中.

其實如果要深刻理解的話,您可以把紅色部分用tomcat部署成服務端,綠色和紫色文件單獨新建一個小項目作為純客戶端去調用服務端,這樣就不會感覺本項目即是服務端又是客戶端了.

服務端相關文件

Fruit.java

遠程方法調用時要用到的入參類,服務端和客戶端可以用該參數作數據載體. 

所以客戶端也必須要有該類, 該類最好和IPerson.class一並打成jar包丟給客戶端使用.

package com.king.code.service.invoke;

import java.io.Serializable;
import java.util.Date;
//水果
public class Fruit implements Serializable{
    private static final long serialVersionUID = 1883838732853579826L;
    
    Integer id;//編號
    String name;//名稱
    Double weight;//重量
    String color;//顏色
    Date pickDay;//采摘日期
    
    public Fruit() {
        super();
    }
    
    public Fruit(Integer id, String name, Double weight, String color, Date pickDay) {
        super();
        this.id = id;
        this.name = name;
        this.weight = weight;
        this.color = color;
        this.pickDay = pickDay;
    }



    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getWeight() {
        return weight;
    }

    public void setWeight(Double weight) {
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Date getPickDay() {
        return pickDay;
    }

    public void setPickDay(Date pickDay) {
        this.pickDay = pickDay;
    }

    @Override
    public String toString() {
        return "Fruit [id=" + id + ", name=" + name + ", weight=" + weight + ", color=" + color + ", pickDay=" + pickDay + "]";
    }
    
    
}

 

IPerson.java

暴露的接口類,客戶端也必須要有該類, 該類最好和Fruit.class一並打成jar包丟給客戶端使用.

package com.king.code.service.invoke;

/**
 * 人接口
 * @author King
 */
public interface IPerson {
    public String eat(String fruitName);

    public String eat(Fruit fruit);
}

 

Person.java

暴露的接口實現類,客戶端不一定要該類,只要有它的接口父類IPerson.class即可.

package com.king.code.service.invoke;
/**
 * 人實現類
 * @author King
 *
 */
public class Person implements IPerson {
    @Override    
    public String eat(String fruitName){
        System.out.println("begin------");
        System.out.println("i'm eating"+ fruitName );
        System.out.println("end------");
        return "service ha eaten " + fruitName;
    }
    
    @Override    
    public String eat(Fruit fruit){
        System.out.println("begin------");
        System.out.println("i'm eating"+fruit);
        System.out.println("end------");
        return "service has eaten "+ fruit;
    }
}

 

remote-service.xml

相當於通常使用的spring基礎配置文件,只不過配置很少就2個bean,第一個被引用,第二個被暴露.

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <!-- 人接口 -->
    <bean id="person" class="com.king.code.service.invoke.Person"/>
    
    <bean name="/person" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="person" />
        <property name="serviceInterface" value="com.king.code.service.invoke.IPerson" />
    </bean> 
    
</beans>

 

 web.xml

這個不多說了

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringRMI</display-name>
  <servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:/remote-service.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

 

 

 客戶端相關文件

 

Fruit.java

 參考服務端Fruit.java,且整個包路徑也要完全一致

IPerson.java

 參考IPerson.java,且整個包路徑也要完全一致

remote-client-local.xml

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

        <!-- 人接口 -->
        <bean id="person"
            class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
            <property name="serviceUrl">
                <value>http://localhost:8080/SpringRMI/person</value>
            </property>
            <property name="serviceInterface">
                <value>com.king.code.service.invoke.IPerson</value>
            </property>
        </bean>
        
        
</beans>

 

 

 Client.java Main方法入口

package com.king.code.client.invoke;

import java.util.Date;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.king.code.service.invoke.Fruit;
import com.king.code.service.invoke.IPerson;
/**
 * 客戶端調用類
 * @author King
 *
 */
public class Client  {
    //讀取配置文件
    static ApplicationContext context = new ClassPathXmlApplicationContext("remote-client-local.xml");
    
    public static void main(String[] args) {
        eatFruit1();
        eatFruit2();
    }
    
    public static void eatFruit1()  {
        IPerson service = (IPerson) context.getBean("person");
        String  response = service.eat("蘋果");
        System.out.println(response);
    }
    
    public static void eatFruit2()  {
        IPerson service = (IPerson) context.getBean("person");
        Fruit fruit = new Fruit(1,"西瓜",2.2d,"green",new Date());
        String  response = service.eat(fruit);
        System.out.println(response);
    }
    
}

 

 

 

本文原創,轉載請說明出處 by 金墨痴 http://www.cnblogs.com/whatlonelytear/p/5841152.html 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM