Rob*_*lan 12

优点和缺点类似于任何类RPC(远程过程调用)系统.简洁的表面外观,因为事实上遥远的物体可以被视为本地的.

这对简化编程似乎是一个很大的好处,但是有隐藏的成本.分布式系统存在延迟问题以及程序员必须意识到的部分故障的可能性.远程方法的调用受到安全性,延迟问题,网络故障等的潜在故障的影响.对这些问题进行处理可能会对可靠性造成灾难.

沃尔多等人.对这些问题进行了很好的讨论.

  • 不再是"Waldo et al"的链接:| (3认同)

raf*_*mag 5

根据我的经验:

优点:

  • 易于启动
  • 动态类加载非常强大
  • 如果你实现类似下面的东西你不能长时间改变服务器端并开发客户端(rmi服务器上的一个例外必须在类路径中获取这些类 - 所以要么通过网络服务器,要么包含它们并重建服务器)

你可以实现两个这样的接口:

常见任务界面:

public interface Task<T extends Serializable> extends Serializable {

    T execute();

}
Run Code Online (Sandbox Code Playgroud)

Rmi接口:

public interface RmiTask extends Remote {

    <T extends Serializable> T executeTask(Task<T> task) throws RemoteException;

}
Run Code Online (Sandbox Code Playgroud)

RmiTask 服务器端的实现:

public class RmiTaskExecutor implements RmiTask {

    public <T extends Serializable> T executeTask(Task<T> task) {
        return task.execute();
    }

}
Run Code Online (Sandbox Code Playgroud)

示例客户端Task实现:

public class IsFileTask implements Task<Boolean> {

    final String path;

    public IsFileTask(String path) {
        this.path = path;
    }

    public Boolean execute() {
        return new File(path).isFile();
    }

}
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 可能是不安全的,使用动态类装载(客户服务实现通过类型)时-例如,你知道RMI服务器调用method()PassedObject,但奇妙的客户端可以覆盖此方法并执行任何他想做的有...
  • 很难实现可以通过Internet工作的回调(它需要建立从服务器到客户端的新连接 - 通过NAT /路由器/防火墙传递它可能很有挑战性)
  • 当你在执行远程方法时突然断开连接时,会发生这种方法不会返回(我建议将rmi调用包装成Callables并使用定义的超时运行它们).