RMI: Как получить реальный объект, имея Proxy?
От: vlp  
Дата: 02.01.08 15:40
Оценка:
Добрый день! К стати, с Новым Годом!

Есть ли способ получить объект, на который ссылается RMI Proxy, если известно, что объект этот находится в той же виртуальной машине?
Сценарий таков:
Имеем интерфейс-фабрику, который создаёт и выдает клиентам некоторые объекты через RMI.
Все объекты, которые создает фабрика — Remote, то есть, передаются по ссылке, а не по значению.
Этот же интерфейс содержит методы, в которые клиент может передать эти только-что созданные объекты, для некоторой обработки. Пример:

class MyFactoryImpl implements IMyFactory {
    public IMyObject createObject() {
        return new MyObjectImpl();
    }

    public void processObject(IMyObject object) {
        // do something with object
        // MyObjectImpl impl = (MyObjectImpl) object; // <------
    }
}


В отмеченной строке объект, переданный от клиента, должен подвергнуться некой обработке, причем должен использоваться тот факт, что на самом деле это ссылка на MyObjectImpl. То есть, фабрика "знает" о внутренностях объектов, которые она же и плодит. Однако при вызове метода processObject через RMI приходит прокси, реализующий IMyObject и все вызовы методов на нем отправляются через RMI/TCP в ту же виртуальную машину, где и находится моя фабрика.

А теперь вопрос:
как с наименьшими затратами (без дополнения IMyObject новыми методами для получения какого-нибудь "UID" объекта) получить из IMyObject реальный MyObjectImpl, на который "указывает" прокси. Считаем, что "чужие" объекты, созданные в других фабриках, сюда передаваться не будут, поэтому известно, что получить MyObjectImpl можно всегда.

Поиском пользовался — возможно, есть способ сделать подобное через смарт-прокси, но нет ли способа проще?
Спасибо заранее!
Re: RMI: Как получить реальный объект, имея Proxy?
От: Blazkowicz Россия  
Дата: 02.01.08 16:05
Оценка:
Здравствуйте, vlp, Вы писали:

vlp>
vlp>class MyFactoryImpl implements IMyFactory {
vlp>    public void processObject(IMyObject object) {
vlp>        // do something with object
vlp>        // MyObjectImpl impl = (MyObjectImpl) object; // <------
vlp>    }
vlp>}
vlp>


Любопытно, что фабрика, которая вроде как реализация GoF Abstract Factory, занимается ещё и какой-то обработкой информации.

vlp>А теперь вопрос:

vlp>как с наименьшими затратами (без дополнения IMyObject новыми методами для получения какого-нибудь "UID" объекта) получить из IMyObject реальный MyObjectImpl, на который "указывает" прокси. Считаем, что "чужие" объекты, созданные в других фабриках, сюда передаваться не будут, поэтому известно, что получить MyObjectImpl можно всегда.

Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI.
Re[2]: RMI: Как получить реальный объект, имея Proxy?
От: Blazkowicz Россия  
Дата: 02.01.08 16:08
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI.

Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.
Re[3]: RMI: Как получить реальный объект, имея Proxy?
От: vlp  
Дата: 02.01.08 16:35
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI.

B>Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.

"фабрика" создает объекты и возвращает клиенту. Клиент может вызывать методы этих объектов через некий стандартный интерфейс IMyObject, после чего передать этот объект обратно на серверную сторону, где его и надо "превратить" обратно в MyObjectImpl
Re[2]: RMI: Как получить реальный объект, имея Proxy?
От: vlp  
Дата: 02.01.08 16:40
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, vlp, Вы писали:


vlp>>
vlp>>class MyFactoryImpl implements IMyFactory {
vlp>>    public void processObject(IMyObject object) {
vlp>>        // do something with object
vlp>>        // MyObjectImpl impl = (MyObjectImpl) object; // <------
vlp>>    }
vlp>>}
vlp>>


B>Любопытно, что фабрика, которая вроде как реализация GoF Abstract Factory, занимается ещё и какой-то обработкой информации.


Тут дело только в названии класса — ну, пусть будет не фабрика, а что нибудь другое Включает реализацию паттерна Factory + еще методы.
Re[4]: RMI: Как получить реальный объект, имея Proxy?
От: Blazkowicz Россия  
Дата: 02.01.08 16:44
Оценка:
Здравствуйте, vlp, Вы писали:

vlp>Здравствуйте, Blazkowicz, Вы писали:


B>>>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI.

B>>Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.

vlp>"фабрика" создает объекты и возвращает клиенту. Клиент может вызывать методы этих объектов через некий стандартный интерфейс IMyObject, после чего передать этот объект обратно на серверную сторону, где его и надо "превратить" обратно в MyObjectImpl


IMyObject по какой-то причине Remote. Почему бы не использовать объекты by value для передачи данных?
Re[3]: RMI: Как получить реальный объект, имея Proxy?
От: vlp  
Дата: 02.01.08 16:47
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>>Странное желание искать решение через одно место. Почему бы не поступить так как это сделали в EJB. Локальные вызовы должны быть локальными, а не через RMI.

B>Sorry, не допонял вопрос, что объекты едут на клиента а оттуда "возвращаются" на сервер.

А вот еще пример, допустим, что item, list, factory — все объекты создаются удаленно и передаются по ссылке через RMI:

IItem item1 = factory.createItem();
IItem item2 = factory.createItem();
IList list = factory.createList();

list.add(item1);
list.add(item2);


В реализации интерфейса IList на сервере происходит то же самое — хочется получить из пришедшей через RMI заглушки IItem сам объект, какой-нибудь ItemImpl...
Какие тут есть способы?
Re[5]: RMI: Как получить реальный объект, имея Proxy?
От: vlp  
Дата: 02.01.08 16:54
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

vlp>>"фабрика" создает объекты и возвращает клиенту. Клиент может вызывать методы этих объектов через некий стандартный интерфейс IMyObject, после чего передать этот объект обратно на серверную сторону, где его и надо "превратить" обратно в MyObjectImpl


B>IMyObject по какой-то причине Remote. Почему бы не использовать объекты by value для передачи данных?


Понятно, что передача по значению все решила бы. Но, во-первых, раз уж я натолкнулся на этот момент, хотелось бы уже все выяснить. Во-вторых, скорее всего IMyObject это будет не просто объект с данными, вызовы методов этого интерфейса должны обрабатываться на сервере.
Re: RMI: Как получить реальный объект, имея Proxy?
От: vlp  
Дата: 02.01.08 17:21
Оценка:
Можно поставить вопрос по-другому: как, имея RemoteRef на объект, средствами RMI-runtime (не заводя вручную собственных HashMap с ИД и объектами) получить сам объект, если он находится в той же виртуальной машине?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.