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包丢给客户端使用.

  1. package com.king.code.service.invoke;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Date;
  5. //水果
  6. public class Fruit implements Serializable{
  7. private static final long serialVersionUID = 1883838732853579826L;
  8.  
  9. Integer id;//编号
  10. String name;//名称
  11. Double weight;//重量
  12. String color;//颜色
  13. Date pickDay;//采摘日期
  14.  
  15. public Fruit() {
  16. super();
  17. }
  18.  
  19. public Fruit(Integer id, String name, Double weight, String color, Date pickDay) {
  20. super();
  21. this.id = id;
  22. this.name = name;
  23. this.weight = weight;
  24. this.color = color;
  25. this.pickDay = pickDay;
  26. }
  27.  
  28. public Integer getId() {
  29. return id;
  30. }
  31.  
  32. public void setId(Integer id) {
  33. this.id = id;
  34. }
  35.  
  36. public String getName() {
  37. return name;
  38. }
  39.  
  40. public void setName(String name) {
  41. this.name = name;
  42. }
  43.  
  44. public Double getWeight() {
  45. return weight;
  46. }
  47.  
  48. public void setWeight(Double weight) {
  49. this.weight = weight;
  50. }
  51.  
  52. public String getColor() {
  53. return color;
  54. }
  55.  
  56. public void setColor(String color) {
  57. this.color = color;
  58. }
  59.  
  60. public Date getPickDay() {
  61. return pickDay;
  62. }
  63.  
  64. public void setPickDay(Date pickDay) {
  65. this.pickDay = pickDay;
  66. }
  67.  
  68. @Override
  69. public String toString() {
  70. return "Fruit [id=" + id + ", name=" + name + ", weight=" + weight + ", color=" + color + ", pickDay=" + pickDay + "]";
  71. }
  72.  
  73. }

IPerson.java

暴露的接口类,客户端也必须要有该类, 该类最好和Fruit.class一并打成jar包丢给客户端使用.

  1. package com.king.code.service.invoke;
  2.  
  3. /**
  4. * 人接口
  5. * @author King
  6. */
  7. public interface IPerson {
  8. public String eat(String fruitName);
  9.  
  10. public String eat(Fruit fruit);
  11. }

Person.java

暴露的接口实现类,客户端不一定要该类,只要有它的接口父类IPerson.class即可.

  1. package com.king.code.service.invoke;
  2. /**
  3. * 人实现类
  4. * @author King
  5. *
  6. */
  7. public class Person implements IPerson {
  8. @Override
  9. public String eat(String fruitName){
  10. System.out.println("begin------");
  11. System.out.println("i'm eating"+ fruitName );
  12. System.out.println("end------");
  13. return "service ha eaten " + fruitName;
  14. }
  15.  
  16. @Override
  17. public String eat(Fruit fruit){
  18. System.out.println("begin------");
  19. System.out.println("i'm eating"+fruit);
  20. System.out.println("end------");
  21. return "service has eaten "+ fruit;
  22. }
  23. }

remote-service.xml

相当于通常使用的spring基础配置文件,只不过配置很少就2个bean,第一个被引用,第二个被暴露.

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3.  
  4. <beans>
  5.  
  6. <!-- 人接口 -->
  7. <bean id="person" class="com.king.code.service.invoke.Person"/>
  8.  
  9. <bean name="/person" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
  10. <property name="service" ref="person" />
  11. <property name="serviceInterface" value="com.king.code.service.invoke.IPerson" />
  12. </bean>
  13.  
  14. </beans>

web.xml

这个不多说了

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <display-name>SpringRMI</display-name>
  4. <servlet>
  5. <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
  6. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  7. <init-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>classpath*:/remote-service.xml</param-value>
  10. </init-param>
  11. <load-on-startup>2</load-on-startup>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
  15. <url-pattern>/</url-pattern>
  16. </servlet-mapping>
  17. </web-app>

客户端相关文件

Fruit.java

参考服务端Fruit.java,且整个包路径也要完全一致

IPerson.java

参考IPerson.java,且整个包路径也要完全一致

remote-client-local.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
  3.  
  4. <beans>
  5.  
  6. <!-- 人接口 -->
  7. <bean id="person"
  8. class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
  9. <property name="serviceUrl">
  10. <value>http://localhost:8080/SpringRMI/person</value>
  11. </property>
  12. <property name="serviceInterface">
  13. <value>com.king.code.service.invoke.IPerson</value>
  14. </property>
  15. </bean>
  16.  
  17. </beans>

Client.java Main方法入口

  1. package com.king.code.client.invoke;
  2.  
  3. import java.util.Date;
  4.  
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;
  7.  
  8. import com.king.code.service.invoke.Fruit;
  9. import com.king.code.service.invoke.IPerson;
  10. /**
  11. * 客户端调用类
  12. * @author King
  13. *
  14. */
  15. public class Client {
  16. //读取配置文件
  17. static ApplicationContext context = new ClassPathXmlApplicationContext("remote-client-local.xml");
  18.  
  19. public static void main(String[] args) {
  20. eatFruit1();
  21. eatFruit2();
  22. }
  23.  
  24. public static void eatFruit1() {
  25. IPerson service = (IPerson) context.getBean("person");
  26. String response = service.eat("苹果");
  27. System.out.println(response);
  28. }
  29.  
  30. public static void eatFruit2() {
  31. IPerson service = (IPerson) context.getBean("person");
  32. Fruit fruit = new Fruit(1,"西瓜",2.2d,"green",new Date());
  33. String response = service.eat(fruit);
  34. System.out.println(response);
  35. }
  36.  
  37. }

本文原创,转载请说明出处 by 金墨痴 http://www.cnblogs.com/whatlonelytear/p/5841152.html

SpringRMI远程方法调用【原】的更多相关文章

  1. Spring RMI (Spring 远程方法调用)【原】

    所需jar包...?    不纠结,一股脑儿全导! 源码地址:http://pan.baidu.com/s/1jG8eOmy 先放结构图如下,客户端和服务端都在一个项目中.也可以把服务端的xxx导成j ...

  2. SpringRMI远程方法调用

    Spring为各种远程访问技术的集成提供了工具类. 该小段引用自 http://www.open-open.com/lib/view/open1408957290478.html Spring远程支持 ...

  3. 《Java核心技术 卷II 高级特性(原书第9版)》

    <Java核心技术 卷II 高级特性(原书第9版)> 基本信息 原书名:Core Java Volume II—Advanced Features(Ninth Edition) 作者: ( ...

  4. JAVA RMI远程方法调用简单实例[转]

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外 一台 ...

  5. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  6. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  7. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  8. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. JSON数据格式解析

    JSON数据的语法规则 1.数据以键值对的形式 2.数据由逗号分隔 3.花括号保存对象 4.方括号保存数组 以PHP的数组为例: <?php $arr = array( "aaaa&q ...

  2. 我终于激活Windows Server2008 R2了!!

    经过我不懈的努力,在重装两次系统后,我终于实现了win2008的KMS激活.这个方法可以避免虚拟机架设KMS服务器的麻烦.现将激活方法发布如下. 首先要选择安装的操作系统.Windows Server ...

  3. html5應用緩存

    HTML5使用了應用緩存,就是web應用緩存,使得在離線狀態下可以訪問web'應用. 應用緩存的優點: 離線訪問-可以在無網的狀態下訪問應用 速度-有緩存的應用加載更快 瀏覽器負載-瀏覽器只從服務器加 ...

  4. xml和对象 转换

    //测试数据 static List<User> list = new List<User>() { new User(){id=1001 ,name="语文&quo ...

  5. Leonardo's Notebook UVALive - 3641(置换)

    题意: 给出26个大写字母的置换B,问是否存在一个置换A,使得A2 = B 解析: 两个长度为n的相同循环相乘,1.当n为奇数时结果也是一个长度为n的循环:2. 当n为偶数时分裂为两个长度为n/2 ( ...

  6. 2015 HIAST Collegiate Programming Contest D

    You have been out of Syria for a long time, and you recently decided to come back. You remember that ...

  7. Migrate Maven Projects to Java 11

    Migrate Maven Projects to Java 11 So you want to migrate to Java 11 but your Maven project is still ...

  8. java将一个javabean转化为另一个javabean

    公司的项目是用webservice来进行前后台对接,启动后台后需要刷服务才能在前台生成对应的代码,但是有一个很恶心的地方,它给每个service都生成了一个model,于是出现后台只有一个javabe ...

  9. NOIP2018退役记

    退役失败*1. md可能只有一次啊.

  10. [hgoi#2019/2/16t2]friend

    题目描述 在一个遥远的国度里有n个人,每个人手上写着4个互不相同的数. 这个国度比较奇怪,如果两个人至少有一个数字相同,则他们是一对朋友. 现在这n个人按序号从左到右排成了一排,每个人都想知道在他左边 ...