Изменение интерфейса CORBA без перекомпиляции - PullRequest
4 голосов
/ 31 августа 2008

Я хотел бы добавить метод к интерфейсу CORBA моего существующего сервера. Для этого потребуется перекомпиляция всех клиентов?

Я использую TAO.

Ответы [ 5 ]

4 голосов
/ 04 сентября 2008

Перекомпиляция клиентов не требуется (и не должна быть, независимо от того, какой ORB вы используете). Как указал Адам, поиск выполняется по имени операции (прямое сравнение текста).

Я сделал то, что вы описываете с нашей системой на основе ACE / TAO, и не обнаружил никаких проблем (серверы были на ACE / TAO C ++, клиенты были ACE / TAO C ++, C # с использованием Borland's Janeva и OmniORBPy).

3 голосов
/ 04 сентября 2008

При условии, что клиенты и серверы обмениваются данными через IIOP, перекомпиляция не требуется. Сообщение IIOP содержит имя интерфейса, имя метода и параметры. Если ничего из этого не изменилось, то все должно оставаться совместимым. Добавление другого метода в интерфейс не изменит ничего из этого.

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

1 голос
/ 19 сентября 2008

Клиенты, использующие колокейшн (то есть работающие в одном и том же процессе с колокейшн в ORB) должны быть перекомпилированы. Удаленные клиенты могут остаться прежними - как было сказано ранее, методы сопоставляются по символическому имени.

1 голос
/ 31 августа 2008

Операции (методы) ищутся по имени, поэтому вам нужно только перекомпилировать клиентов, которые используют новую операцию.

0 голосов
/ 05 декабря 2013

Зависит от использования нового метода idl. Если вызов Corba является статическим (SII), что означает, что ваш клиент связан с заглушкой, вы должны перекомпилировать заглушку, если хотите использовать новый интерфейс добавленного метода.

Если вызов corba является динамическим (DII), для клиента не требуется заглушка. Никакой перекомпиляции не требуется. В этом случае ваш клиентский код должен выглядеть так:

     remoteObjRef->invoke("methodname", args); // send("methodname", args)

Я выполнял вызов CORBA DII четыре года назад, и он работает с клиентом TAO и сервисом TAO / Jacorb / IONA corba.

...