• Spring 4 整合RMI技术及发布多个服务(xjl456852原创)


    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. }
    先启动服务端,然后再启动客户端进行调用.
    服务端显示如下:
     
    客户端显示如下:
     

    感谢原作者:




  • 相关阅读:
    directives vant之Field输入限制【v-input-float】
    【vue】 typeScript OSS图片压缩处理工具类
    vue单页面加载js方法
    H5网页打开App以及App内某个页面
    适配iphoneX万能方法!!!
    固定底部button按钮,兼容各种手机、微信等【flex布局】
    天行数据小程序demo
    iview Weapp index索引器 cityjs 增加每个城市的code值
    小程序上传图片至七牛云(支持多张上传、预览、删除图片)
    (转)异步与非阻塞之间的区别(看到的最清晰的说明)
  • 原文地址:https://www.cnblogs.com/xjl456852/p/6581126.html
Copyright © 2020-2023  润新知