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. FreeMarker:模板开发指南

    ylbtech-FreeMarker:模板开发指南 1.返回顶部 1. Section Contents 入门 模板 + 数据模型 = 输出 数据模型一览 模板一览 数值,类型 基本内容 类型 模板 ...

  2. c# 生成 xml 文件

    方法一: using System; using System.Xml; using System.IO; using System.Text; public class ReadWriteXml { ...

  3. git删除远程分支和本地分支以及更改本地和分支名字

    问题描述: 当我们集体进行项目时,将自定义分支push到主分支master之后,如何删除远程的自定义分支呢 问题解决: (1)使用命令git branch -a 查看所有分支 注: 其中,remote ...

  4. 如何精通javascript

    http://stackoverflow.com/questions/2628672/what-should-every-javascript-programmer-know Not jQuery. ...

  5. HashMap1

    一.Java并发基础 当一个对象或变量可以被多个线程共享的时候,就有可能使得程序的逻辑出现问题. 在一个对象中有一个变量i=0,有两个线程A,B都想对i加1,这个时候便有问题显现出来,关键就是对i加1 ...

  6. 栗染-Not enough physical memory is available to power on this virtual machine with its configured settings.

    这是在打开虚拟机的时候报的错 解决办法:打开虚拟机的时候选择以管理员身份运行()目测可以 原文参考来自:http://blog.csdn.net/qq_35757415/article/details ...

  7. SP1043 GSS1 - Can you answer these queries I(猫树)

    给出了序列A[1],A[2],…,A[N]. (a[i]≤15007,1≤N≤50000).查询定义如下: 查询(x,y)=max{a[i]+a[i+1]+...+a[j]:x≤i≤j≤y}. 给定M ...

  8. 基于.Net Core的API框架的搭建(2)

    4.加入数据库支持 下面我们为项目加入数据库支持,修改appsettings.json: 然后我们要生成实体类,打开VS工具->NuGet包管理器->程序包管理器控制台: 输入命令: Sc ...

  9. spring 简单实现BeanFactory(转)

    原文地址: http://blog.csdn.net/mlc1218559742/article/details/52776160 有没有发现上面的代码与利用反射实现工厂模式的代码很相似.对,你没有看 ...

  10. 通过创建元素从而实现三个下拉框的联动效果(create.Element("option"))和提交表单时的验证p.match("请选择")

    <html> <head> <meta charset="utf-8"> <title>下拉框</title> < ...