Spring集成RMI實現遠程調用


  前提:

  1.開發工具:

    jdk tomcat ecplise,開發工具的使用本篇不做介紹。

  2.需具備以下知識:javase servelt web rmi spring maven 

一、關於RMI

  請參考另外一篇文章:https://www.cnblogs.com/liandy001/p/11182055.html

二、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:待補充。
  • JAX RPC:待補充。
  • JMS:待補充。

三、服務端

  服務端我們采用常見的web應用(當然普通應用也是一樣的),web應用在tomcat服務器啟動后,通過DispatcherServlet初始化spring容器,創建遠程對象並在注冊表注冊。

  1.創建web應用

  

  

  

  

   

  2.通過maven管理項目的jar包

  

  

  3.配置pom依賴的jar包  

  <properties>
      <spring.version>4.0.2.RELEASE</spring.version>
    <mybatis.version>3.2.8</mybatis.version>
    <slf4j.version>1.7.12</slf4j.version>
    <log4j.version>1.2.17</log4j.version>
  </properties>
  <dependencies>
        <!-- 單元測試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <!-- 表示開發的時候引入,發布的時候不會加載此包 -->
            <scope>test</scope>
        </dependency>
        <!-- java ee包 -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
        <!-- spring框架包 start -->
        <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-oxm</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-jdbc</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-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- spring框架包 end -->
        <!-- mybatis框架包 start -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- mybatis框架包 end -->
        <!-- 數據庫驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>
        <!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <!-- jstl標簽類 -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!-- log start -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <!-- log END -->
        <!-- Json -->
        <!-- 格式化對象,方便輸出日志 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.6</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <!-- 上傳組件包 start -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>
        <!-- 上傳組件包 end -->
 
        <!-- AL相關添加 -->
        <dependency>
            <groupId>net.sourceforge.jexcelapi</groupId>
            <artifactId>jxl</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>    
  </dependencies>
pom.xml

  

   4.創建域模型及service  

/**  
 * @Title:  Fruit.java   
 * @Package cn.com.kamfu   
 * @Description:    TODO(用一句話描述該文件做什么)   
 * @author: liandy    
 * @date:   2019年7月13日 下午10:21:02   
 * @version V1.0 
 */
package cn.com.kamfu;



import java.io.Serializable;
import java.util.Date;
/**   
 * @ClassName:  Fruit   
 * @Description:TODO(這里用一句話描述這個類的作用)   
 * @author: liandy 
 * @date:   2019年7月13日 下午10:21:02   
 *     
 */
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 + "]";
    }
    
    
}
Fruit
/**  
 * @Title:  IService.java   
 * @Package cn.com.kamfu   
 * @Description:    TODO(用一句話描述該文件做什么)   
 * @author: liandy    
 * @date:   2019年7月13日 下午10:21:39   
 * @version V1.0 
 */
package cn.com.kamfu;

/**   
 * @ClassName:  IService   
 * @Description:TODO(這里用一句話描述這個類的作用)   
 * @author: liandy 
 * @date:   2019年7月13日 下午10:21:39   
 *     
 */
public interface IService {
     String eat(String fruitName);

     String eat(Fruit fruit);
}
IService
/**  
 * @Title:  Service.java   
 * @Package cn.com.kamfu   
 * @Description:    TODO(用一句話描述該文件做什么)   
 * @author: liandy    
 * @date:   2019年7月13日 下午10:22:02   
 * @version V1.0 
 */
package cn.com.kamfu;

/**   
 * @ClassName:  Service   
 * @Description:TODO(這里用一句話描述這個類的作用)   
 * @author: liandy 
 * @date:   2019年7月13日 下午10:22:02   
 *     
 */
public class Service implements IService {

    /**   
     * <p>Title: eat</p>   
     * <p>Description: </p>   
     * @param fruitName
     * @return   
     * @see cn.com.kamfu.IService#eat(java.lang.String)   
     */
    @Override
    public String eat(String fruitName) {
        // TODO Auto-generated method stub
        System.out.println("begin------");
        System.out.println("i'm eating"+ fruitName );
        System.out.println("end------");
        return "service ha eaten " + fruitName;
    }

    /**   
     * <p>Title: eat</p>   
     * <p>Description: </p>   
     * @param fruit
     * @return   
     * @see cn.com.kamfu.IService#eat(cn.com.kamfu.Fruit)   
     */
    @Override
    public String eat(Fruit fruit) {
        // TODO Auto-generated method stub
        System.out.println("begin------");
        System.out.println("i'm eating"+fruit);
        System.out.println("end------");
        return "service has eaten "+ fruit;
    }

}
Service

  

  5.在類目錄下創建spring容器  

<?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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
    <!-- 人接口 -->
    <bean id="service" class="cn.com.kamfu.Service"/>
    
    <bean name="/service" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="service" ref="service" />
        <property name="serviceInterface" value="cn.com.kamfu.IService" />
    </bean>    
</beans>
remote-service.xml

 

  6.web.xml中初始化spring容器  

<?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_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SpringRMIServer</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
    <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>
web.xml

 

  7.導出jar包(客戶端依賴)  

  

  

   

    一直next,直至Finish,命名為service.jar並保存到本地。

 

  8.項目總體結構

  

 

 

 

四、客戶端

  1.創建普通Java應用程序

  

  

 

  2.通過maven管理項目的jar包

  

 

  3.配置pom依賴的jar包  

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>SpringRMIClient</groupId>
  <artifactId>SpringRMIClient</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
         <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-ldap</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-acl</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-cas</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-taglibs</artifactId>
            <version>4.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.3.5.RELEASE</version>
        </dependency>



        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.7.3</version>
        </dependency>

        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.2.21.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>4.2.21.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.3.2.Final</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.20</version>
        </dependency>


        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
            <version>3.0.2.RELEASE</version>
        </dependency>      
  </dependencies>
</project>
pom.xml

  

  4.導入服務jar包(service.jar)

  

  

 

   5.創建Spring容器  

<?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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

        <bean id="service"
            class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
            <property name="serviceUrl">
                <value>http://localhost:8080/SpringRMIServer/service</value>
            </property>
            <property name="serviceInterface">
                <value>cn.com.kamfu.IService</value>
            </property>
        </bean>       
</beans>
remote-client-local.xml

  

  6.編寫主程序  

/**  
 * @Title:  App.java   
 * @Package cn.com.kamfu   
 * @Description:    TODO(用一句話描述該文件做什么)   
 * @author: liandy    
 * @date:   2019年7月13日 下午10:10:04   
 * @version V1.0 
 */
package cn.com.kamfu;

import java.util.Date;

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

/**   
 * @ClassName:  App   
 * @Description:TODO(這里用一句話描述這個類的作用)   
 * @author: liandy 
 * @date:   2019年7月13日 下午10:10:04   
 *     
 */
public class App {
    public static ApplicationContext context = new ClassPathXmlApplicationContext("remote-client-local.xml");
    /**   
     * @Title: main   
     * @Description: TODO(這里用一句話描述這個方法的作用)   
     * @param: @param args      
     * @return: void      
     * @throws   
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        eatFruit1();
        eatFruit2();
        
    }
    public static void eatFruit1()  {
        IService service = (IService) context.getBean("service");
        String  response = service.eat("蘋果");
        System.out.println(response);
    }
    
    public static void eatFruit2()  {
        IService service = (IService) context.getBean("service");
        Fruit fruit = new Fruit(1,"西瓜",2.2d,"green",new Date());
        String  response = service.eat(fruit);
        System.out.println(response);
    }
}
App

  

 

五、模擬客戶端遠程訪問服務端

  1.啟動Server端web應用

  

 

  2.查看控制台tomcat是否啟動成功

 

  3.啟動Client端訪問Server端

 

   4.通過客戶端控制台console可以查看到方法成功被調用。

 


免責聲明!

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



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