rmi需要建立两个项目,一个是服务端的项目,一个是客户端的项目.服务端项目启动后,再启动客户端项目去调用服务端的方法.

我们建立两个maven项目:
pom.xml配置:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.xiejl</groupId>
  7. <artifactId>test</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <properties>
  10. <spring-version>4.3.7.RELEASE</spring-version>
  11. </properties>
  12. <dependencies>
  13. <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-beans</artifactId>
  17. <version>${spring-version}</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-context</artifactId>
  22. <version>${spring-version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework</groupId>
  26. <artifactId>spring-context-support</artifactId>
  27. <version>${spring-version}</version>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework</groupId>
  31. <artifactId>spring-core</artifactId>
  32. <version>${spring-version}</version>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework</groupId>
  36. <artifactId>spring-aop</artifactId>
  37. <version>${spring-version}</version>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework</groupId>
  41. <artifactId>spring-aop</artifactId>
  42. <version>${spring-version}</version>
  43. </dependency>
  44. <dependency>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-orm</artifactId>
  47. <version>${spring-version}</version>
  48. </dependency>
  49. <dependency>
  50. <groupId>org.springframework</groupId>
  51. <artifactId>spring-orm</artifactId>
  52. <version>${spring-version}</version>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.springframework</groupId>
  56. <artifactId>spring-web</artifactId>
  57. <version>${spring-version}</version>
  58. </dependency>
  59. <dependency>
  60. <groupId>org.springframework</groupId>
  61. <artifactId>spring-webmvc</artifactId>
  62. <version>${spring-version}</version>
  63. </dependency>
  64. <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
  65. <dependency>
  66. <groupId>org.aspectj</groupId>
  67. <artifactId>aspectjrt</artifactId>
  68. <version>1.8.10</version>
  69. </dependency>
  70. <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
  71. <dependency>
  72. <groupId>org.aspectj</groupId>
  73. <artifactId>aspectjweaver</artifactId>
  74. <version>1.8.10</version>
  75. </dependency>
  76. </dependencies>
  77. </project>

第一个是服务端的maven项目:
服务接口,和以前不一样了,不用实现远程接口了。HelloService:
  1. package com.xjl456852.rmi.spring;
  2. /**
  3. * 定义一个远程接口
  4. *
  5. * @author leizhimin 2009-8-17 13:53:38
  6. */
  7. public interface HelloService {
  8. /**
  9. * 简单的返回“Hello World!"字样
  10. *
  11. * @return 返回“Hello World!"字样
  12. */
  13. public String helloWorld();
  14. /**
  15. * 一个简单的业务方法,根据传入的人名返回相应的问候语
  16. *
  17. * @param someBodyName 人名
  18. * @return 返回相应的问候语
  19. */
  20. public String sayHelloToSomeBody(String someBodyName);
  21. }
服务实现类,加入了注解:
  1. package com.xjl456852.rmi.spring;
  2. import org.springframework.stereotype.Service;
  3. /**
  4. * 远程的接口的实现
  5. *
  6. * @author leizhimin 2009-8-17 13:54:38
  7. */
  8. @Service
  9. public class HelloServiceImpl implements HelloService {
  10. public HelloServiceImpl() {
  11. }
  12. /**
  13. * 简单的返回“Hello World!"字样
  14. *
  15. * @return 返回“Hello World!"字样
  16. */
  17. public String helloWorld() {
  18. return "Hello World!";
  19. }
  20. /**
  21. * 一个简单的业务方法,根据传入的人名返回相应的问候语
  22. *
  23. * @param someBodyName 人名
  24. * @return 返回相应的问候语
  25. */
  26. public String sayHelloToSomeBody(String someBodyName) {
  27. return "你好," + someBodyName + "!";
  28. }
  29. }
服务端启动程序:
  1. package com.xjl456852.rmi.spring;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. /**
  5. * 通过Spring发布RMI服务
  6. *
  7. * @author leizhimin 2009-8-17 14:22:06
  8. */
  9. public class HelloHost {
  10. public static void main(String[] args) {
  11. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  12. System.out.println("RMI服务伴随Spring的启动而启动了.....");
  13. }
  14. }

Spring 配置: applicationContext.xml:
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:task="http://www.springframework.org/schema/task"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  10. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
  11. <!-- component-scan自动搜索@Component , @Controller , @Service , @Repository等标注的类 -->
  12. <context:component-scan base-package="com.xjl456852" />
  13. <bean id="serviceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
  14. <property name="serviceName" value="rmiSpring"/>
  15. <property name="serviceInterface" value="com.xjl456852.rmi.spring.HelloService"/>
  16. <property name="registryPort" value="8888"/>
  17. <property name="service" ref="helloServiceImpl"/>
  18. </bean>
  19. </beans>
启动服务端程序,HelloHost:
 

第二个是客户端的maven项目:
客户端调用有两种方式,一种是使用Spring,一种不使用,这里仅介绍使用Spring的情况。
客户端需要依赖服务端的 HelloService接口,需要将这个接口放入到客户端中.

客户端的启动类:
  1. package com.xjl456852.rmi.spring;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import javax.annotation.Resource;
  5. import java.rmi.RemoteException;
  6. /**
  7. * 通过Spring来调用RMI服务
  8. *
  9. * @author leizhimin 2009-8-17 14:12:46
  10. */
  11. public class HelloClient {
  12. @Resource
  13. private HelloService helloService;
  14. public static void main(String[] args) throws RemoteException {
  15. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  16. HelloService hs = (HelloService) ctx.getBean("helloService");
  17. System.out.println(hs.helloWorld());
  18. System.out.println(hs.sayHelloToSomeBody("xjl456852"));
  19. }
  20. }

在Spring中配置客户端要调用服务, applicationContext.xml:
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:task="http://www.springframework.org/schema/task"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  10. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
  11. <!-- component-scan自动搜索@Component , @Controller , @Service , @Repository等标注的类 -->
  12. <context:component-scan base-package="com.xjl456852" />
  13. <bean id="helloService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  14. <property name="serviceUrl" value="rmi://192.168.176.131:8888/rmiSpring"/>
  15. <property name="serviceInterface" value="com.xjl456852.rmi.spring.HelloService"/>
  16. </bean>
  17. </beans>


启动客户端,查看结果:
 

下面是服务端发布多个服务接口的配置:
假设服务端还有一个服务,叫OtherService:
  1. package com.xjl456852.rmi.spring;
  2. /**
  3. * Created by xjl on 2017/3/19.
  4. */
  5. public interface OtherService {
  6. public int random();
  7. }
服务端的实现类:
  1. package com.xjl456852.rmi.spring;
  2. import org.springframework.stereotype.Service;
  3. import java.util.Random;
  4. /**
  5. * Created by xjl on 2017/3/19.
  6. */
  7. @Service
  8. public class OtherServiceImpl implements OtherService{
  9. Random random = new Random();
  10. public int random() {
  11. System.out.println("invoke random method");
  12. return random.nextInt(100);
  13. }
  14. }
服务端的Spring配置:
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:task="http://www.springframework.org/schema/task"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  10. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
  11. <!-- component-scan自动搜索@Component , @Controller , @Service , @Repository等标注的类 -->
  12. <context:component-scan base-package="com.xjl456852" />
  13. <bean id="serviceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
  14. <property name="serviceName" value="rmiSpring"/>
  15. <property name="serviceInterface" value="com.xjl456852.rmi.spring.HelloService"/>
  16. <property name="registryPort" value="8888"/>
  17. <property name="service" ref="helloServiceImpl"/>
  18. </bean>
  19. <bean id="serviceExporter_Other" class="org.springframework.remoting.rmi.RmiServiceExporter">
  20. <property name="serviceName" value="rmiSpringOther"/>
  21. <property name="serviceInterface" value="com.xjl456852.rmi.spring.OtherService"/>
  22. <property name="registryPort" value="8888"/>
  23. <property name="service" ref="otherServiceImpl"/>
  24. </bean>
  25. </beans>


下面是客户端的配置:
客户端需要依赖服务端的OtherService接口
然后客户端的Spring配置如下:
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:task="http://www.springframework.org/schema/task"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  7. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
  8. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
  9. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
  10. http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">
  11. <!-- component-scan自动搜索@Component , @Controller , @Service , @Repository等标注的类 -->
  12. <context:component-scan base-package="com.xjl456852" />
  13. <bean id="helloService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  14. <property name="serviceUrl" value="rmi://192.168.176.131:8888/rmiSpring"/>
  15. <property name="serviceInterface" value="com.xjl456852.rmi.spring.HelloService"/>
  16. </bean>
  17. <bean id="otherService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
  18. <property name="serviceUrl" value="rmi://192.168.176.131:8888/rmiSpringOther"/>
  19. <property name="serviceInterface" value="com.xjl456852.rmi.spring.OtherService"/>
  20. </bean>
  21. </beans>
客户端的测试类:
  1. package com.xjl456852.rmi.spring;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import javax.annotation.Resource;
  5. import java.rmi.RemoteException;
  6. /**
  7. * 通过Spring来调用RMI服务
  8. *
  9. * @author leizhimin 2009-8-17 14:12:46
  10. */
  11. public class HelloClient {
  12. @Resource
  13. private HelloService helloService;
  14. @Resource
  15. private OtherService otherService;
  16. public static void main(String[] args) throws RemoteException {
  17. ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  18. HelloService hs = (HelloService) ctx.getBean("helloService");
  19. System.out.println(hs.helloWorld());
  20. System.out.println(hs.sayHelloToSomeBody("xjl456852"));
  21. OtherService os = (OtherService) ctx.getBean("otherService");
  22. System.out.println("otherService:" + os.random());
  23. }
  24. }
先启动服务端,然后再启动客户端进行调用.
服务端显示如下:
 
客户端显示如下:
 

感谢原作者:




Spring 4 整合RMI技术及发布多个服务(xjl456852原创)的更多相关文章

  1. 黑马_13 Spring Boot:05.spring boot 整合其他技术

    13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 05.spring boot 整合其他 ...

  2. Spring+CXF整合来管理webservice(服务器启动发布webservice)

    Spring+CXF整合来管理webservice    实现步骤:      1. 添加cxf.jar 包(集成了Spring.jar.servlet.jar ),spring.jar包 ,serv ...

  3. Spring Boot 整合视图层技术,application全局配置文件

    目录 Spring Boot 整合视图层技术 Spring Boot 整合jsp Spring Boot 整合freemarker Spring Boot 整合视图层技术 Spring Boot 整合 ...

  4. Spring 5.x 、Spring Boot 2.x 、Spring Cloud 与常用技术栈整合

    项目 GitHub 地址:https://github.com/heibaiying/spring-samples-for-all 版本说明: Spring: 5.1.3.RELEASE Spring ...

  5. Spring Boot从入门到精通之:二、Spring Boot整合JPA

    springboot-jpa 开发工具 系统: windows10 开发工具: Intellij IDEA 2018.2.6 springboot: 2.0.6.RELEASE jdk: 1.8.0_ ...

  6. Spring MVC & Boot & Cloud 技术教程汇总(长期更新)

    昨天我们发布了Java成神之路上的知识汇总,今天继续. Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ ...

  7. spring boot 2.0(一)权威发布spring boot2.0

    Spring Boot2.0.0.RELEASE正式发布,在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误,然后Spring ...

  8. spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-mock.jar来进行辅助测试,正式应用系统中是用不得这些类的。

    Spring jar包的描述:针对3.2.2以上版本 org.springframework spring-aop ——Spring的面向切面编程,提供AOP(面向切面编程)实现 org.spring ...

  9. WebService之Spring+CXF整合示例

    一.Spring+CXF整合示例 WebService是一种跨编程语言.跨操作系统平台的远程调用技术,它是指一个应用程序向外界暴露一个能通过Web调用的API接口,我们把调用这个WebService的 ...

随机推荐

  1. matlab采用mex编译多个cpp文件

    最近在看matlab code时,由于本人使用的是64系统,而code中的mex文件时在32位系统上编译的,所以需要重新自己编译maxflowmex.cpp,但是直接mex maxflowmex.cp ...

  2. 基于ELK的传感器数据分析练习

    目录 Sensor Data Analytics Application 数据构成 数据模型设计 Logstash配置 Kibana可视化 Sensor Data Analytics Applicat ...

  3. noip2002矩阵覆盖(搜索)

    矩阵覆盖 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见 ...

  4. RandomAccessFile使用场景及总结

    大家在学到Java中IO流的时候学到了各种流,对文件的各种操作.但是唯独可能对RandomAccessFile对象不会去过多的研究,那么这个到底有什么用呢? RandomAccessFile的唯一父类 ...

  5. javascript检测基本类型值或引用类型值的类型方法

    首先javascript的数据类型分为两种数据类型:基本数据数据类型和引用数据类型 基本数据类型:Number,String,Boolean,Undefined,Null.原始值,是简单的数据段,可按 ...

  6. mysql 的索引hash和b+tree 区别

    索引hash相当于数组,键值对组合,对于id = 6或者status= 2这样条件查询,但是对于id>12等这样,用btree索引最好.

  7. Spark SQL概念学习系列之Spark SQL入门(八)

    前言 第1章   为什么Spark SQL? 第2章  Spark SQL运行架构 第3章 Spark SQL组件之解析 第4章 深入了解Spark SQL运行计划 第5章  测试环境之搭建 第6章 ...

  8. Cesium加载影像

    注意:使用自定义数据源时,Cesium.Viewer类参数必须设置为 baseLayerPicker:false A. 使用天地图数据源 //天地图var provider=new Cesium.We ...

  9. struct结构的一些内容

    srtuct结构的定义: 访问修饰符 struct  结构名{ //方法体 } 结构定义的特点: 1.结构中可以有字段(属性),也可以有方法 2.定义时,结构的字段不能被赋初值 3.结构和类一样都有默 ...

  10. FCC 基础JavaScript 练习5

    在赌场21点游戏中,玩家可以通过计算牌桌上已经发放的卡牌的高低值来让自己在游戏中保持优势,这就叫21点算法. 根据下面的表格,每张卡牌都分配了一个值.如果卡牌的值大于0,那么玩家应该追加赌注.反之,追 ...