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