Spring集成RMI——使用远程服务【实践的详细记录】

       最近在阅读《Spring in Action》,在读到第十五章(使用远程服务)时,在实践中,遇到很多问题,在此记录一下自己探索的成果。

远程过程调用(RPC):通俗来讲,就是在一个应用程序中调用另一个应用程序的方法。

       想要做远程调用的测试,就要写两个应用程序。本次实践中写的服务端应用为:SpringRPCServiceSpittr,用于导出RMI服务;写的客户端应用程序为:SpringRPCClientSpittr, 用于装配RMI服务,实践远程调用。(详细的代码在github上

过程记录

       当我按照《Spring in Action》书上写的内容开发好上面两个应用,首先在tomcat上启动 SpringRPCServiceSpittr,结果一启动tomcat,就报下面的错误:

启动服务端(注册RMI服务)应用程序是报错

       这个错误太让人抓狂了,怎么都不知道是什么原因。于是我就不断的在网上查【大哭,好久都没查到任何情况】,偶然间看着这么一篇文章:从懵逼到恍然大悟之Java中RMI的使用。终于似乎明白点了什么,在tomcat上启动服务端应用(用于导出RMI服务)之前,要先启动jdk/bin/rmiregistry 。

2019年4月18日重新测试,发现,当RegistryPort端口换成 1199之后,不需要再手动启动:jdk/bin/rmiregistry。服务端应用可以直接启动tomcat。当服务端应用启动的时候会同时占用1099(该端口被默认占用)和1199端口。所有不能将registoryPort设置成1099。

       知道这个情况下之后,又调试了好长时间,将服务端应用的registerPort改了,并需要按照如下的步骤操作,客户端才能正常测试工作:

/**
     * 使用RmiServiceExporter 将SpitterServiceImpl发布为RMI服务
     * 默认情况下RmiServiceExport 会尝试绑定到本地机器 1099 端口上的RMI注册表
     * 这就是使用Spring 把某个bean转变成RMI服务所需要做的全部工作
     * @param spitterService
     * @return
     */
    @Bean
    public RmiServiceExporter rmiExporter(SpitterService spitterService){
        RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
        rmiServiceExporter.setServiceInterface(SpitterService.class);
        rmiServiceExporter.setService(spitterService);
        rmiServiceExporter.setServiceName(SpitterService.class.getSimpleName());
        rmiServiceExporter.setRegistryPort(1199);
        return rmiServiceExporter;
    }

步骤一: 服务端应用(maven项目)的target/classes目录下启动jdk/bin/rmiregister

启动rmiregister

此时能够监听到1099端口被占用:

1099端口被占用

步骤二:按contro+c 关闭jdk/rmiregistry

关闭rmiregister

此时可以看到1099端口对应的进程被关掉:

关闭rmiregister

步骤三:在tomcat上启动服务端的应用

此时tomcat就启动正常了:

启动服务端(导出RMI服务)应用

最后,就可以在客户端应用程序上进行测试了:

进行远程调用