Являются ли удаленные объекты (сервер) java RMI одноэлементными?

Я уже некоторое время использую java RMI, но я не мог понять, являются ли удаленные заглушки RMI (на стороне сервера) одноэлементными? Причина, по которой я спрашиваю:

давайте предположим, что один из методов реализации RMI ниже в цепочке вызовов имеет синхронизированный метод. Если по какой-то причине логика в синхронизированном методе нарушена (или зависает), будущие вызовы RMI (от клиента) также будут зависать при попытке получить доступ к этому синхронизированному методу. Это справедливо только в том случае, если заглушки RMI будут одноэлементными. Если новый объект создается на стороне сервера при каждом удаленном вызове от клиента, это не будет проблемой, потому что методы вызываются из другого объекта, и синхронизированный метод больше не будет проблемой.

Короче говоря. Я пытаюсь понять, как JVM внутренне поддерживает удаленные объекты rmi на стороне сервера и являются ли они одноэлементными. Я пробовал много разных javadocs, но они нигде прямо не упоминают об этом.

Любая помощь приветствуется!

EDIT Основываясь на некоторых вопросах и комментариях, я уточняю вопрос: мой реальный вопрос заключается в том, действительно ли RMI на стороне сервера поддерживает какой-то пул объектов на основе того, какой объект вы экспортируете и регистрируете. ? Можете ли вы связать более одного объекта одного и того же типа с одним и тем же именем (несколько имитируя пул объектов, где RMI может дать мне любой из зарегистрированных объектов) или для того, чтобы иметь несколько экземпляров одного и того же объекта, мне придется зарегистрировать их под разными именами


person shahshi15    schedule 12.09.2014    source источник


Ответы (4)


Во-первых, «заглушка» — это клиентское понятие, на сервере заглушек нет.

Что касается самих удаленных объектов, система RMI не создает экземпляры объектов для вас, вы сами создаете экземпляры и экспортируете их. Вы создаете один экземпляр объекта, экспортируете этот объект и связываете его в реестре под определенным именем. Все вызовы клиентских заглушек, полученные от одного и того же имени в реестре, в конечном итоге будут направлены на один и тот же объект на сервере.

Можете ли вы связать более одного объекта одного типа с одним и тем же именем (несколько имитируя пул объектов, где RMI может дать мне любой из зарегистрированных мной объектов)

Нет, вы можете привязать только один объект в реестре под заданным именем. Но объект, который вы связываете, сам может быть прокси-сервером для вашего собственного пула объектов, например, с помощью механизм Spring AOP CommonsPoolTargetSource.

person Ian Roberts    schedule 12.09.2014
comment
Вы можете создать столько экземпляров S, сколько захотите. Следовательно, они вовсе не синглетоны. - person user207421; 13.09.2014
comment
@Ian Roberts: Итак, вы говорите, что если я создам несколько объектов одного и того же класса, экспортирую эти объекты и свяжу их в реестре с разными именами, это сработает .. Думаю, я понял эту часть. Но я предполагаю, что мой реальный вопрос заключался в том, поддерживает ли RMI на стороне сервера какой-то пул объектов, основанный на том, какой объект вы создали? (Думаю, я также обновлю свой вопрос этим) - person shahshi15; 13.09.2014
comment
@EJP То, что я пытался сделать, было таким же, как и ваше: инфраструктура RMI сама не создает никаких ваших удаленных объектов, она просто направляет вызовы любым объектам, которые вы решили экспортировать. Если вы хотите привязать объект в реестре, который поддерживается пулом серверных объектов, то вам решать, как создать пул самостоятельно и использовать подходящий прокси-объект в качестве (единственного) удаленного объекта, который вы привязываете в реестре. под этим именем. В этом отношении удаленные объекты ничем не отличаются от локальных. - person Ian Roberts; 13.09.2014
comment
Я комментировал слова «они синглтоны», которые вы сейчас удалили. - person user207421; 14.09.2014
comment
У меня гораздо лучшее представление о том, как все это работает. Спасибо, парни! Цените помощь! - person shahshi15; 17.09.2014

RMI основан на шаблоне проектирования прокси.

Посмотрите, что написано здесь

Сервер RMI — это приложение, которое создает ряд удаленных объектов. Сервер RMI отвечает за:

  1. Создание экземпляра удаленного объекта (например, CarImpl instance = new CarImpl());
  2. Экспорт удаленного объекта;
  3. Привязка экземпляра удаленного объекта к реестру RMI.
person Luciana Campello    schedule 12.09.2014
comment
Не отвечает на вопрос. - person user207421; 13.09.2014

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

РЕДАКТИРОВАТЬ Основываясь на некоторых вопросах и комментариях, я уточняю вопрос: мой реальный вопрос заключается в том, действительно ли RMI на стороне сервера сохраняет какой-то пул объектов на основе того, какой объект вы экспортируете и регистрируете?

No.

Можете ли вы связать более одного объекта одного типа с одним и тем же именем

No.

Мне придется зарегистрировать их под разными именами.

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

person user207421    schedule 12.09.2014
comment
Итак, как это работает? Если я зарегистрирую несколько объектов на стороне сервера (один и тот же объект) с одним и тем же именем, это будет несколько объектов вместо одного объекта? Или мне придется зарегистрировать несколько объектов на стороне сервера (одного и того же класса реализации) с разными именами? - person shahshi15; 13.09.2014
comment
У удаленных объектов есть имена только в том случае, если вы привязываете их к реестру. Это только один из способов получить их. Вы также можете вернуть их как результаты удаленных методов. Рассмотрим, например, объект удаленного сеанса. У вас будет по одному для каждого клиента, и вы вернете их из какого-то объекта входа в систему, новый для каждого запроса на вход. - person user207421; 13.09.2014

Из документов Java:

http://docs.oracle.com/javase/7/docs/platform/rmi/spec/rmi-arch3.html

Метод, отправленный средой выполнения RMI в реализацию удаленного объекта, может выполняться или не выполняться в отдельном потоке. Среда выполнения RMI не дает никаких гарантий в отношении сопоставления вызовов удаленных объектов с потоками. Поскольку вызов удаленного метода для одного и того же удаленного объекта может выполняться одновременно, реализация удаленного объекта должна быть уверена, что ее реализация является потокобезопасной.

Да, метод на стороне сервера синхронизирован. Реализация зависит от платформы. Вы не можете предположить ничего другого о многопоточности. И вы, конечно, не можете предположить, является ли удаленный объект синглтоном.

Кроме того, может быть полезно взглянуть на активацию удаленных объектов:

http://docstore.mik.ua/orelly/java-ent/jenut/ch03_06.htm

http://docs.oracle.com/javase/7/docs/api/java/rmi/activation/package-summary.html

person FoggyDay    schedule 12.09.2014
comment
Метод на стороне сервера не синхронизируется, если вы не синхронизируете его самостоятельно. - person user207421; 13.09.2014