为什么应用程序服务器需要存根才能执行远程调用?

问题描述:

这不是一个问题,而是一个讨论...我不知道这是否是正确的地方,或不..为什么应用程序服务器需要存根才能执行远程调用?

As you know, we can write our own java classloaders that can load classes over the network

那么,为什么应用服务器不只是做呢?为什么当我们对另一个应用程序服务器内部的远程方法进行远程调用时,为什么我们必须有存根来返回类型和参数呢?

我认为应用程序服务器可以使用类似NetworkedClassLoader的东西加载这些返回类型和参数远程处理。

+0

如果这确实是一个讨论,而不是一个问题,那么它不属于Stack Overflow。 – 2011-02-26 17:44:46

+0

这是RMI所做的。见http://download.oracle.com/javase/1.5.0/docs/guide/rmi/codebase.html – 2011-02-26 17:55:10

我不打算讨论它,只是为了提出我的看法。

应用程序服务器的重点在于在服务器上完成工作。如果您在客户端加载类EJBImplementation并调用其某些方法,那么将在客户端完成工作。此外,要做好这项工作,EJBImplementation将不得不拉动一个大型的依赖关系链,对本地数据库进行一些调用,上帝知道还有什么。所以,在大多数情况下,这种处理不能在客户端实际上完成

因此,我们为EJBImplementation创建存根(proxy是术语),它将方法调用通过网络传递给服务器。

+0

你不明白我的意思......我的意思是为什么我们自己创建存根,为什么不只是客户端尝试使用某个自定义类加载器从服务器获取它们?在我上面的问题中查看'JB Nizet'的编辑链接。 – 2011-02-27 11:18:01

+0

@محمد你问*“为什么我们必须有存根”*并得到答案。另外,“我们”不会创建存根。存根对象是作为代理动态创建的。他们不从服务器加载,他们只对服务器进行RMI调用。 – 2011-02-27 19:27:22

代理模式的总体思路是:

  1. 到的事实,他们谈论的对象不是自己的地址空间屏蔽客户,这是一个远程服务器上其他地方在网络上。
  2. 将工作从客户端卸载到服务器。
  3. 将操作集中到可以由任何可以访问网络的客户端共享的单个服务中。