再コンパイルせずに CORBA インターフェイスを変更する
質問
既存のサーバーの CORBA インターフェイスにメソッドを追加したいと考えています。すべてのクライアントを再コンパイルする必要がありますか?
TAOを使っています。
解決
クライアントの再コンパイルは必要ありません (使用する ORB に関係なく、再コンパイルする必要はありません)。Adam が示したように、検索は操作名によって行われます (ストレート テキスト比較)。
ACE/TAO ベースのシステムで説明されている内容を実行しましたが、問題は発生しませんでした (サーバーは ACE/TAO C++、クライアントは ACE/TAO C++、Borland の Janeva を使用した C#、および OmniORBPy でした)。
他のヒント
クライアントとサーバーが IIOP 経由で通信していると仮定すると、再コンパイルは必要ありません。IIOP メッセージには、インターフェイスの名前、メソッドの名前、およびパラメーターが含まれます。これらの点が何も変わっていない場合は、すべての互換性が維持されるはずです。インターフェイスに別のメソッドを追加しても、既存のものは何も変わりません。
一方、オブジェクトが別のプロトコルを使用している場合、またはクライアントがサーバーとインプロセスであるため IIOP をバイパスしている場合は、すべてを再コンパイルする必要がある場合があります。
オペレーション (メソッド) は名前で検索されるため、新しいオペレーションを使用するクライアントを再コンパイルするだけで済みます。
コロケーションを使用しているクライアント (つまり、ORB でコロケーションが有効になっている同じプロセス内で実行されている場合)を再コンパイルする必要があります。リモート クライアントは同じままにすることができます。前述したように、メソッドはシンボル名によって照合されます。
新しい idl メソッドの使用方法に依存します。Corba の呼び出しが静的 (SII) である場合、つまりクライアントがスタブにリンクされている場合、新しく追加されたメソッド インターフェイスを使用する場合はスタブを再コンパイルする必要があります。
corba の呼び出しが動的 (DII) である場合、クライアントに必要なスタブはありません。再コンパイルは必要ありません。この場合、クライアント コードは次のようになります。
remoteObjRef->invoke("methodname", args); // send("methodname", args)
4 年前に CORBA DII 呼び出しを実行しましたが、TAO クライアントと TAO/Jacorb/IONA corba サービスで動作しました。