SpringRMI远程方法调用【原】

时间:2023-01-01 10:56:38

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.

项目源码样例 SpringRMI远程方法调用【原】

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

项目结构

  • 红色为服务端必要文件.
  • 绿色为客户端必要文件.
  • 紫色为服务端和客户端都必要的文件.

为了方便自测,我把服务端和客户端都整合在一个项目中.

其实如果要深刻理解的话,您可以把红色部分用tomcat部署成服务端,绿色和紫色文件单独新建一个小项目作为纯客户端去调用服务端,这样就不会感觉本项目即是服务端又是客户端了.

SpringRMI远程方法调用【原】

服务端相关文件

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

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

  1. Spring RMI &lpar;Spring 远程方法调用&rpar;【原】

    所需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 高级特性&lpar;原书第9版&rpar;》

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

  4. JAVA RMI远程方法调用简单实例&lbrack;转&rsqb;

    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. 多线程爬坑之路-学习多线程需要来了解哪些东西&quest;&lpar;concurrent并发包的数据结构和线程池&comma;Locks锁,Atomic原子类&rpar;

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

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

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

随机推荐

  1. CodeIgniter 3&period;0问题集锦

    1.由于ci 3.0的session采用文件存储,在配置好session存储的目录后,在使用时如果遇到如下session错误. 此处 fc 目录为我设置的session目录. 解决将fc目录权限设为7 ...

  2. Windows 2008 R2系统开机时如何不让Windows进行磁盘检测?

    开始→运行,在运行对话框中键入“chkntfs /t:0”,即可将磁盘扫描等待时间设置为0, 如果要在计算机启动时忽略扫描某个分区,比如C盘,可以输入“chkntfs /x c:”命令:如果要恢复对C ...

  3. java中的缓冲流BufferedWriter和BufferedReader

    java中的缓冲流有BufferedWriter和BufferedReader 在java api 手册中这样说缓冲流: 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取.可以指 ...

  4. 关于数据库管理系统DBMS--关系型数据库(MySQL&sol;MariaDB)

    数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统——RDBMS: 主要 ...

  5. Thread类相关方法

    线程对象 每一个线程都是和类Thread的实例相关联的.在Java中,有两种基本的使用Thread对象的方式,可用来创建并发性程序.  1.在应用程序需要发起异步任务的时候,只要生成一个Thread对 ...

  6. 异常小结:上一张图搞清楚Java的异常机制

    下面是Java异常类的组织结构,红色区域的异常类表示是程序需要显示捕捉或者抛出的. Throwable Throwable是Java异常的*类,所有的异常都继承于这个类. Error,Excepti ...

  7. Notes of Daily Scrum Meeting(12&period;23)

    今天的团队任务总结如下: 团队成员 今日团队工作 陈少杰 调试网络连接,寻找新的连接方法 王迪 建立搜索的UI界面 金鑫 查阅相关资料,熟悉后台的接口 雷元勇 建立搜索的界面 高孟烨 继续美化界面,熟 ...

  8. AngularJS中转换响应内容

    从远程API获取到的响应内容,通常是json格式的,有时候需要对获取到的内容进行转换,比如去除某些不需要的字段,给字段取别名,等等. 本篇就来体验在AngualrJS中如何实现. 在主页面,还是从co ...

  9. Python有趣现象(不定时更新)

    1.list中extend方法有趣现象 1.1 List+=Str 与 List.extend(Str) list1 = [11,2,45] str1 = 'Michael' list1.extend ...

  10. bip39

    BIP: 39 (助记词) Layer: Applications Title: Mnemonic code for generating deterministic keys Author: Mar ...