У меня есть вызов RMI, определенный как:
public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;
Функция выполняет поиск в базе данных и заполняет два списка ArrayList. Вызывающая функция ничего не получает. Я считаю, что это работает с векторными типами.
Нужно ли мне использовать Vector, или есть способ заставить его работать, не делая двух вызовов. У меня есть и другие идеи, которые я, вероятно, использую, например, возврат пары ключ / значение, но я хотел бы знать, смогу ли я заставить это работать.
Обновление:
Я бы принял все полученные ответы, если бы мог. Я не знал стоимости сети, поэтому имеет смысл переделать функцию, чтобы она возвращала LinkedHashMap вместо двух ArrayLists.




Вы теряете свои ссылки при удаленном звонке. Вам нужно будет вернуть списки, а не ожидать, что они будут заполнены удаленным вызовом.
Аргументы в RMI вызывают сериализованный. При десериализации на сервере создается копия списков. Если бы списки остались на стороне клиента, то количество сетевых вызовов было бы довольно большим. Вы можете передавать удаленные объекты, но остерегайтесь последствий для производительности.
Как упоминает Том, вы можете передавать удаленные объекты. Вам нужно будет создать класс для хранения вашего списка, который реализует Remote. Каждый раз, когда вы передаете что-то, реализующее Remote в качестве аргумента, всякий раз, когда принимающая сторона его использует, он поворачивается и делает удаленный вызов назад вызывающей стороне для работы с этим объектом.
Как уже упоминалось другими, при передаче объектов в качестве параметров методу RMI объект будет сериализован, а затем десериализован на другом конце внутри целевого объекта, содержащего метод RMI. Это отделяет ссылку от переданных исходных объектов, поскольку теперь у вас есть два разных объекта: один в клиентском коде, вызывающем метод, и один на удаленной стороне.
В этом конкретном примере лучшим подходом было бы разбить вызовы ваших методов (поскольку вы, кажется, делаете две вещи в одном методе: получение имен клиентов и получение номеров клиентов), и вместо этого ваши результаты возвращаются вызывающей стороне, а не передаются коллекция ... вот так:
public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;
public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;
Поскольку и ArrayList, и String реализуют Serializable, результаты в коллекции будут сериализованы и отправлены по сети клиентскому коду, вызывающему метод, после чего вы можете работать с данными, как вам нужно. Если вместо этого вам нужно использовать настраиваемый объект в коллекции, если ваш класс реализует интерфейс java.io.Serializable и следует спецификации для этого интерфейса, у вас не должно возникнуть проблем.
Это привело бы к двум отдельным вызовам по сети, но это гораздо более чистое и простое взаимодействие, позволяющее избежать проблемы разрыва ссылок в исходном примере.
Здесь нет ссылки. Аргументы и результаты передаются в RMI по значению, если они не экспортируются удаленными объектами.