Как разработать API для работы с удаленными объектами с помощью Java RMI - PullRequest
1 голос
/ 23 июня 2010

У меня есть удаленный объект, предоставляемый через 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 ]

1 голос
/ 23 июня 2010

То, что вы пытаетесь сделать, называется шаблоном команд.
Цель использования этого шаблона - уменьшить сцепление.

Это, как говорится, на самом деле не произойдет, так как ваши идентификаторы сериализации не будут совпадать каждый раз, когда вы вносите изменения и компилируете.

Вы теряете безопасность при совершении звонков.

Вы должны внедрить свой собственный формат сообщений, в котором вы помещаете свою полезную нагрузку и маршалл сообщения, а затем отменяете его по прибытии (это обычно делается с XML в наши дни).

В основном, используя шаблон команд с RMI, вы теряете все преимущества RMI и просто используете его в качестве транспорта.

Если это ваша цель, то WebServices будет гораздо лучшим способом.

0 голосов
/ 24 июня 2010

Почему вы хотите сократить интерфейс до одного API? Поддержка нескольких удаленных методов в интерфейсе очень мала: вам нужно только объявить их, написать их и вызвать их. Никаких накладных расходов RMI вообще. И вы все равно должны написать код для выполнения каждой операции, плюс код для отправки из операции () в требуемый фрагмент кода, который с использованием отдельных методов сделал бы для вас бесплатно. И результат намного яснее.

...