2010-06-23 2 views
1

У меня есть удаленный объект, открытый через RMI, который я использую для выполнения нескольких действий на ресурсе, который хранится у объекта. Прямо сейчас у меня есть метод для каждой операции, которую мне нужно выполнить.Как создать API для работы с удаленными объектами с помощью java 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, который делает это автоматически?

ответ

1

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

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

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

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

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

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

0

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

Смежные вопросы