如何使用Java RMI设计用于操作远程对象的API

时间:2010-06-23 08:46:51

标签: java rmi

我有一个通过RMI公开的远程对象,我用它来对象所拥有的资源执行几项操作。现在我有我需要执行的每个操作的方法。

示例:

public interface IRobotController {
    public int walk(int meters);
    public void dance(int seconds);
}

public interface RMIRobotController implements IRobotController, java.rmi.Remote {}

public class RobotController implements RMIRobotController {
    private Robot robot;

    ...

    public int walk(int meters) {
        return robot.walk(meters);
    }

    public void dance(int seconds) {
        robot.dance(seconds);
    }
}

我想重构API,以便我只有一个方法operate()。假设我不想通过RMI返回对机器人对象的实际引用,因为我有时需要执行多个操作,并且不希望往返。

我基于Callable<T>

的概念提出了这个问题
public abstract class RobotCallable<T> {
    protected Robot robot;

    public void setRobot(Robot robot) {
        this.robot = robot;
    }

    public abstract T call()
}

public class RobotController implements RMIRobotController {
    private Robot robot;

    ...

    public T operate(RobotCallable<T> robotCallable) {
        robotCallable.setRobot(robot)
        return robotCallable.call();
    }
}

我这通常是如何实现的? RMI是否有一些自动执行此操作的机制?

2 个答案:

答案 0 :(得分:1)

您要做的事情称为命令模式 使用此模式的目的是减少耦合。

据说这不会发生,因为每次进行更改和编译时,序列化ID都不匹配。

拨打电话时,您的安全性会下降。

您必须实现自己的消息格式,在其中放置有效负载和消息marshall,然后在到达时解组(这通常使用XML来完成)。

基本上通过将命令模式与RMI一起使用,您将失去RMI的所有好处,并将其用作传输。

如果这是您的目标,那么WebServices将是一个更好的方法。

答案 1 :(得分:0)

为什么要将接口缩减为一个API?在接口中支持多个远程方法的成本非常低:您只需要声明它们,编写它们并调用它们。没有任何RMI开销。而且你必须编写代码来执行每个操作, plus 代码从operation()发送到所需的代码段,这些代码将为您提供单独的方法。结果更加清晰。