Передача по ссылке не возвращается в RMI для ArrayList

У меня есть вызов RMI, определенный как:

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;

Функция выполняет поиск в базе данных и заполняет два списка ArrayList. Вызывающая функция ничего не получает. Я считаю, что это работает с векторными типами.

Нужно ли мне использовать Vector, или есть способ заставить его работать, не делая двух вызовов. У меня есть и другие идеи, которые я, вероятно, использую, например, возврат пары ключ / значение, но я хотел бы знать, смогу ли я заставить это работать.

Обновление:
Я бы принял все полученные ответы, если бы мог. Я не знал стоимости сети, поэтому имеет смысл переделать функцию, чтобы она возвращала LinkedHashMap вместо двух ArrayLists.

Здесь нет ссылки. Аргументы и результаты передаются в RMI по значению, если они не экспортируются удаленными объектами.

user207421 02.01.2020 05:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
3 999
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Аргументы в 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 и следует спецификации для этого интерфейса, у вас не должно возникнуть проблем.

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

Другие вопросы по теме