RMI связывает один и тот же объект дважды, но представляет разные интерфейсы - PullRequest
2 голосов
/ 12 января 2010

Эй, ребята, у меня есть интересный для вас здесь!

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

По сути, на данный момент я настроил его так, чтобы он дважды связывался, один раз с "ISCP" в области управления, и один раз с "CSCP".

Однакокогда клиенты пытаются выполнить привязку (имейте в виду, что они знают только интерфейс CSCP), они получают исключение, в котором говорится, что они не могут найти класс ISCP - но им это НЕ нужно.

Итак, как же это сделать?один объект (сервер) представляет два разных интерфейса RMI на двух разных привязках, разделяя их?

Вы гений, если можете решить этот вопрос для меня: D Если я не был достаточно ясен, дайте мне знать!

Ответы [ 2 ]

1 голос
/ 12 января 2010

Я предлагаю написать два класса адаптеров, один из которых реализует ICSP, а другой - CSCP. Каждый метод в этих классах адаптера вызывает соответствующий метод в «реальном» объекте.

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

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

0 голосов
/ 12 января 2010

Попробуйте использовать Spring Remoting и связать один и тот же объект под разными именами используя разные интерфейсы - он использует отражение для связывания любого Java-объекта (т.е. не требует реализовать Remote) и аналогично искать и вызывать методы.

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
  <property name="serviceName" value="ICSP"/>
  <property name="service" ref="myService"/>
  <property name="serviceInterface" value="example.ICSP"/>
</bean>

<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
  <property name="serviceName" value="CSCP"/>
  <property name="service" ref="myService"/>
  <property name="serviceInterface" value="example.CSCP"/>
</bean>

Их можно использовать программно, используя только библиотеки Spring:

RmiServiceExporter e = new RmiServiceExporter();
e.setServiceName("SCSP");
e.setService(myServiceObj);
e.setServiceInterface(example.SCSP.class);
e.prepare(); // read the doc; I'm not sure this is the exact method
...