spring整合RMI实现Java远程方法调用
来源:互联网 发布:英国皇家芭蕾舞团 知乎 编辑:程序博客网 时间:2024/06/05 20:48
使用Spring对RMI的支持,可以非常容易地构建你的分布式应用。
在服务端,可以通过Spring的org.springframework.remoting.rmi.RmiServiceExporter可以暴露你的服务;
在客户端,通过org.springframework.remoting.rmi.RmiProxyFactoryBean可以使用服务端暴露的服务,非常方便。
这种C/S模型的访问方式,可以屏蔽掉RMI本身的复杂性,如服务端Skeleton和客户端Stub等的处理细节,这些对于服务开发和服务使用的人员来说,都是透明的,无需过度关注,而集中精力开发你的商业逻辑。
下面通过一个例子,说明如何通过Spring集成RMI。
1.服务端接口:
接口1
/** * server端接口 * @author wwh * */public interface HelloRMIService { public int getAdd(int a, int b); public User getUser();}
接口2
/** * Server端接口 * @author wwh */public interface ICalculateRMIService { public int mul(int a, int b); public int get(); public void setAvalue(int avalue); public void setBvalue(int bvalue);}
2.服务端接口实现:
实现接口1
public class HelloRMIServiceImpl implements HelloRMIService { @Override public int getAdd(int a, int b) { return a + b; } @Override public User getUser() { User user = new User(); user.setAge(18); user.setEmail("achiberx@gmail.com"); user.setName("xiaohuihui"); return user; }}
实现接口2
public class CalculateRMIServiceImpl implements ICalculateRMIService { private int avalue = 0, bvalue = 0; @Override public int mul(int a, int b) { return a * b; } public int get() { return avalue*bvalue; } public int getAvalue() { return avalue; } public void setAvalue(int avalue) { this.avalue = avalue; } public int getBvalue() { return bvalue; } public void setBvalue(int bvalue) { this.bvalue = bvalue; }}
3.服务端配置文件 rmiServer.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <bean id="helloRMIServiceImpl" class="com.rmi.test.spring.HelloRMIServiceImpl"> </bean> <!-- 将一个类发布为一个RMI服务 --> <bean id="myRMIServer" class="org.springframework.remoting.rmi.RmiServiceExporter"> <!-- 服务名, 在client端serviceUrl中 --> <property name="serviceName" value="helloRMI"></property> <!-- 被暴露的服务类 --> <property name="service" ref="helloRMIServiceImpl"></property> <!-- 服务的接口, 在client端也有 --> <property name="serviceInterface" value="com.rmi.test.spring.HelloRMIService"></property> <!-- 服务的端口 --> <property name="registryPort" value="9999"></property> </bean> <bean id="calculateRMIServiceImpl" class="com.rmi.test.spring.CalculateRMIServiceImpl"> </bean> <!-- 将一个类发布为一个RMI服务 --> <bean id="ICalculateRMIService" class="org.springframework.remoting.rmi.RmiServiceExporter"> <!-- 被暴露的服务类 --> <property name="service" ref="calculateRMIServiceImpl"></property> <!-- 服务名, 在client端serviceUrl中 --> <property name="serviceName" value="calculate"></property> <!-- 服务的接口, 在client端也有 --> <property name="serviceInterface" value="com.rmi.test.spring.ICalculateRMIService"></property> <!-- 服务的端口 --> <property name="registryPort" value="9999"></property> <!-- 其他的属性自己查看 RmiServiceExporter类--> </bean></beans>
4.服务端发布服务:RMIServiceTest.java
import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * 服务端发布服务功能, 供远程调用 * @author Administrator */public class RMIServiceTest { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("rmiServer.xml"); ICalculateRMIService iCalculateRMIService = applicationContext.getBean("calculateRMIServiceImpl", ICalculateRMIService.class); iCalculateRMIService.setAvalue(4); iCalculateRMIService.setBvalue(5); System.out.println(iCalculateRMIService.get()); System.out.println("server发布服务成功!"); }}
5.客户端接口:(和服务端一样)
接口1
/** * server端接口 * @author wwh * */public interface HelloRMIService { public int getAdd(int a, int b); public User getUser();}
接口2
/** * Server端接口 * @author wwh */public interface ICalculateRMIService { public int mul(int a, int b); public int get(); public void setAvalue(int avalue); public void setBvalue(int bvalue);}
6.客户端配置文件:rmiClient.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 客户端 --> <bean id="myRMIClient" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceInterface" value="com.rmi.test.spring.HelloRMIService"></property> <property name="serviceUrl" value="rmi://127.0.0.1:9999/helloRMI"></property> </bean> <bean id="calculate" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> <property name="serviceInterface" value="com.rmi.test.spring.ICalculateRMIService"></property> <property name="serviceUrl" value="rmi://127.0.0.1:9999/calculate"></property> </bean></beans>
7.客户端测试程序:RMIClient.java
import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * 远程client测试接口 * @author wwh */public class RMIClient { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("rmiClient.xml"); HelloRMIService helloRMIService = applicationContext.getBean("myRMIClient", HelloRMIService.class); System.out.println("client:"); System.out.println("加法接口: " + helloRMIService.getAdd(3, 5)); System.out.println("输出User接口: " + helloRMIService.getUser()); System.out.println("测试ICalculateRMIService接口: "); ICalculateRMIService calculateRMIService = applicationContext.getBean("calculate", ICalculateRMIService.class); System.out.println("调用乘法接口:" + calculateRMIService.mul(5, 5)); System.out.println("get接口: " + calculateRMIService.get()); }}
RMI Without Spring
定义IHello 接口
import java.rmi.Remote;import java.rmi.RemoteException;public interface IHello extends Remote{ public String sayHello(String name) throws RemoteException; public int sum(int a, int b) throws RemoteException;}
实现IHello接口
import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;public class HelloImpl extends UnicastRemoteObject implements IHello{ protected HelloImpl() throws RemoteException { super(); } private static final long serialVersionUID = 1L; @Override public String sayHello(String name) { return "Hello, " + name; } @Override public int sum(int a, int b) { return a+b; }}
服务端开启服务
import java.net.MalformedURLException;import java.rmi.AlreadyBoundException;import java.rmi.Naming;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;public class HelloServer { public static void main(String[] args) { try { IHello rhello = new HelloImpl(); LocateRegistry.createRegistry(8888); Naming.bind("rmi://127.0.0.1:8888/RHello", rhello); System.out.println(">>INFO:远程IHello对象绑定成功!"); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MalformedURLException e) { System.out.println("发生URL异常"); e.printStackTrace(); } catch (AlreadyBoundException e) { System.out.println("发生重复绑定对象异常!"); e.printStackTrace(); } }}
客户端远程访问
import java.net.MalformedURLException;import java.rmi.Naming;import java.rmi.NotBoundException;import java.rmi.RemoteException;public class HelloClient { public static void main(String[] args) { try { IHello rhello = (IHello) Naming.lookup("rmi://127.0.0.1:8888/RHello"); System.out.println(rhello.sayHello("world")); System.out.println(rhello.sum(12, 120)); } catch (MalformedURLException | RemoteException | NotBoundException e) { e.printStackTrace(); } }}
参考链接1
参考链接2
阅读全文
0 0
- spring整合RMI实现Java远程方法调用
- spring整合RMI - Java远程方法调用
- spring整合rmi远程调用
- Java 远程调用 RMI 与Spring的整合实例
- Spring Rmi远程方法调用
- Spring Rmi远程方法调用
- Spring Rmi远程方法调用
- Spring RMI调用远程方法
- Spring RMI实现远程调用
- Java RMI远程方法调用
- Java远程方法调用(RMI)
- Java远程方法调用RMI
- Java Rmi 远程方法调用
- JAVA rmi 远程方法调用
- java rmi远程方法调用
- Java RMI-远程方法调用
- Java远程方法调用(RMI)
- RMI - Java远程方法调用
- Android 蓝牙开发(一)蓝牙通信
- 通过Intent启动Activity、获取Activity返回值
- Git入门学习记录
- unity ios打包提示Apple Mach-O Linker (Id) Errors
- JavaScript学习第一天
- spring整合RMI实现Java远程方法调用
- 数据库测试
- 【洛谷 1218】[USACO1.5]特殊的质数肋骨 Superprime Rib
- 数据结构 冒泡排序
- 什么是内存泄漏?野指针?悬挂指针?空指针异常?
- java 开始学习,输入Welcome to java
- IDEA忽略文件不提交git
- Spring框架、依赖注入、控制反转详解及代码说明
- 转:《在Unity中使用代码类来管理多个Panel(面板)之间的切换》