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
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远程方法调用的更多相关文章
- XML-RPC远程方法调用
一.简介 XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列 ...
- [转]Java远程方法调用
Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口.它使客户机上运行的程序可以调用远 ...
- SpringBoot里使用RMI进行远程方法调用
一.Java RMI定义 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程 ...
- 简单实现Java的RMI——远程方法调用
一.RMI简介: 说到RMI就不得不说RPC了. RPC:(Remote Procedure Call),远程过程调用. RMI(Remote Method Invocation),远程方法调用. R ...
- RMI远程方法调用
RMI远程方法调用:适用于 客户端 调用 服务器 内的方法:(Kotlin 语言编写) 如果业务为二个服务器之间的通信,还是得用消息队列的形式,因为RMI 不适合 双向 调用 下面介绍RMI 的使用方 ...
- 【Java Web开发学习】远程方法调用RMI
Java RMI 远程方法调用Remote Method Invocation 转载:http://www.cnblogs.com/yangchongxing/p/9078061.html 1.创建远 ...
- Java APi 之 RMI远程方法调用
一.什么是RPC RPC全称是remote procedure call,即远程过程调用.它是一种协议,用于从远程计算机上请求服务. 例如有两台服务器A和B,A上的应用想要调用B上应用的方法,但是他们 ...
- Java RMI 远程方法调用
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- Java RMI远程方法调用
RMI(远程接口调用) 1. RMI的原理: RMI系统结构,在客户端和服务器端都有几层结构. 方法调用从客户对象经占位程序(Stub).远程引用层(Remote Reference Layer)和传 ...
随机推荐
- [转]SQL Server 连接串关键字别名
转自:http://stackoverflow.com/questions/3077412/what-is-the-difference-between-trusted-connection-and- ...
- NDK问题总结
转自 这篇文章中很多东西!!:http://blog.chinaunix.net/uid-20746260-id-3910616.html 1. 创建JNI头文件 在工程目录下输入: javah -c ...
- Oracle分区表!
Oracle 数据库分区表的创建和操作 摘要:在大量业务数据处理的项目中,可以考虑使用分区表来提高应用系统的性能并方便数据管理,本文详细介绍了分区表的使用. 在大型的企业应用或企业级的数据库应用中,要 ...
- Java的常用对象①②
Java的常用对象① Java的常用对象有很多,这里只对lang包中常用的Object,Date(Calendar,DateFormat,Math),System,Runtime进行介绍.㈠Objec ...
- Java面向对象㈠ -- 封装
Java的面向对象有三大特征:封装.继承.多态.这里主要对封装进行讲解. 封装可以理解为隐藏一个类的成员变量和成员函数,只对外提供需要提供的成员函数. Java的封装主要通过访问权限控制符:priva ...
- 前端设计师也有必要学习seo,推荐一个seo博客
做前端设计师有一段时间了,现在越来越觉得作为一个前端设计师,必须要懂一些seo的知识. 因为公司的seo们,总是在网站做好以后,提出各种各样的网站修改的需求. 如果前端设计师,能够了解一些基本的seo ...
- Magic xpa 2.5发布 Magic xpa 2.5 Release Notes
Magic xpa 2.5發佈 Magic xpa 2.5 Release Notes Magic xpa 2.5 Release NotesNew Features, Feature Enhance ...
- PSP个人(观众界面)
需求:作为一个观众,我希望了解某一场比赛的比分,以便了解赛况.(满意条件:精确到每一局的结果比分) 需求分析:实现查询数据库中每一局的分数并用界面显示. 生成设计文档: 运用三层架构,实现软件的基本功 ...
- 巧用freemarker
使用Freemarker宏进行可扩展式模块化编程 该文是转载而来,并非我本人所写,但是觉得真心不错,所以收藏一下 一.前言 今天的文章聊一下freemarker的一些特性:宏,我们将使用它写出一些模块 ...
- Python全栈开发 线程和进程
一.线程 线程是程序工作的最小单元,由进程生成,生成的线程间会共享内存空间.Python中创建线程比较简单,导入threading模块,创建线程实例.下面这段代码是一个简单的多线程例子 import ...