在分布式客户端服务器应用程序中,我正在使用Java RMI从客户端计算机调用服务器端方法。在服务器端,正在使用EJB,而应用程序服务器是Glassfish。我在服务器端有一个SampleFacade类,它是一个Java会话Bean,而SampleFacadeRemote是向客户端公开的远程接口(@Remote已与之一起使用)。 SampleFacade实现SampleFacadeRemote接口。

请查看以下代码片段:

        private static SampleFacadeRemote lookupSampleFacade()
        {
            Context c = new InitialContext();
            return (SampleFacadeRemote)c.lookup("java:comp/env/SampleFacade");
        }
        catch (NamingException ne)
       {
          throw new RuntimeException(ne);
       }


在这里,使用返回的对象,可以成功执行远程方法。

我很好奇它是如何工作的。查找方法是否将SampleFacade对象返回给客户端以执行其方法?但是,假定SampleFacade的方法在服务器端/远程JVM上运行。那么lookup()方法将返回哪种类型的对象?请解释其基本机制。

最佳答案

它返回一个存根:一个实现相同远程接口并知道如何与实际远程对象进行通信的客户端对象。

实际上,您应该注意,执行此魔术的并不是lookup()方法:最终,与之相关的bind()方法,甚至对象本身,都会将远程对象转换为其存根,除非存根是什么。已传递给bind()。换句话说,该存根已经在注册表或LDAP或您要查找的内容中,而lookup()则只为您提供找到的内容。

10-04 20:17