Изменение интерфейса CORBA без перекомпиляции
Я хотел бы добавить метод к интерфейсу CORBA моего существующего сервера. Это потребует перекомпиляции всех клиентов?
Я использую TAO.
5 ответов
Перекомпиляция клиентов не требуется (и не должна быть, независимо от того, какой ORB вы используете). Как указал Адам, поиск выполняется по имени операции (прямое сравнение текста).
Я сделал то, что вы описываете с нашей системой на основе ACE/TAO, и не столкнулся с какими-либо проблемами (серверы были на ACE/TAO C++, клиенты были ACE/TAO C++, C# с использованием Borland's Janeva и OmniORBPy).
При условии, что клиенты и серверы обмениваются данными через IIOP, перекомпиляция не требуется. Сообщение IIOP содержит имя интерфейса, имя метода и параметры. Если ничего из этого не изменилось, то все должно оставаться совместимым. Добавление другого метода в интерфейс не изменит ничего из этого.
С другой стороны, если ваши объекты используют другой протокол или клиенты работают с сервером и, таким образом, обходят IIOP, вам может потребоваться убедиться, что все перекомпилировано.
Клиенты, использующие колокейшн (т. Е. Работающие в одном и том же процессе с колокейшн-включением в ORB), должны быть перекомпилированы. Удаленные клиенты могут остаться прежними - как было сказано ранее, методы сопоставляются по символическому имени.
Операции (методы) ищутся по имени, поэтому вам нужно только перекомпилировать клиентов, которые используют новую операцию.
Это зависит от использования нового метода idl. Если вызов Corba является статическим (SII), что означает, что ваш клиент связан с заглушкой, вы должны перекомпилировать заглушку, если хотите использовать новый интерфейс добавленного метода.
Если вызов corba является динамическим (DII), для клиента не требуется заглушки. Никакой перекомпиляции не требуется. В этом случае ваш клиентский код должен выглядеть так:
remoteObjRef->invoke("methodname", args); // send("methodname", args)
Я выполнял вызов CORBA DII четыре года назад, и он работает с клиентом TAO и сервисом TAO/Jacorb/IONA corba.