CORBA IDL ORB POA BOA IIOP Java CORBA
Περιεχόμενα ¨ CORBA Βασικά ¨ IDL ¨ ORB, POA, BOA, … ¨ IIOP ¨ Java και CORBA ¨ CORBA & XML
Remote Object Invocation ¨ Στην CORBA, η επικοινωνία μεταξύ των Clients και των Servers ακολουθεί ένα μοντέλο object-oriented RPC-style. Request (args) CLIENT Reply (result) Top layer SERVER Client Stub Middle layer Server Stub Wire Protocol Bottom layer NETWORK Wire Protocol
Αρχιτεκτονική CORBA ¨ Υπάρχουν πολλές ευκολίες που παρέχουν μια αρχιτεκτονική για distributed object-oriented computing. ¨ H CORBA αποτελείται από 5 βασικά στοιχεία: – ORB (Object Request Broker) – IDL (Interface Definition Language) – DII (Dynamic Invocation Interface) – IR (Interface Repositories) – ΒOA ή POA (Object Adapters)
Αρχιτεκτονική CORBA Object Client Server Client stub CORBA (proxy) library ORB(s)(orbxid) & implementation repository ORB Object skeleton Object adapter ORB TCP Socket client machine server machine
Client Object Implementation IDL IDL ORB NETWORK Μια κλήση από έναν client για ένα Object μέσο Δικτύου
Παράδειγμα IDL module katytrail { module weather { struct Weather. Data { float temp; string wind_direction_and_speed; float rain_expected; float humidity; }; typedef sequence<Weather. Data> Weather. Data. Seq interface Weather. Info { Weather. Data get_weather( in string site ); Weather. Data. Seq find_by_temp( in float temperature ); };
Παράδειγμα IDL (συν. ) interface Weather. Center { register_weather_for_site ( in string site, in Weather. Data site_data ); }; }; }; ¨ Και τα 2 interfaces θα έχουν υλοποιήσεις αντικειμένων.
IDL/Java Mapping ¨ module ¨ package ¨ interface ¨ struct ¨ public final class ¨ operation ¨ method ¨ basic types ¨ primitives ¨ sequence ¨ [] (array of) ¨ Ο IDL 2 Java compiler αντιστοιχεί τους τύπους αριστερά στους τύπους της Java δεξιά. ¨ Ο Stub Code (χρησιμοποιείται από τον Client) και ο Skeleton Code (χρησιμοποιείται από τον Object implementation Code) επίσης δημιουργούνται από τον IDL 2 Java μεταγλωττιστή.
Υλοποιήσεις CORBA ¨Java IDL ¨ORB Plus ¨Java. ORB ¨ORBacus ¨JBroker ¨ORBexpress ¨Joe ¨ORBit ¨Jorba ¨Orbix ¨MICO ¨Orbix. Web ¨NEO ¨Power. Broker ¨Object. Broker ¨RCP-ORB ¨Object. Bus ¨Robin ¨Object. Director ¨Smalltalk Broker ¨omni. ORB 2 ¨SOMobjects ¨ Interbroker ¨OAK ¨TAO ¨ Jac. ORB ¨Visi. Broker ¨Voyager ¨ ¨ ¨ ¨ Arachne Bionic Buffalo Chorus. ORB Component Broker DAIS DIMMA Distributed Smalltalk DOME Dyna. ORB Electra Gem. ORB Harlequin ILU
// uuid and definition of IGrid 1 [ object, uuid(3 CFDB 283 -CCC 5 -11 D 0 -BA 0 B-00 A 0 C 90 DF 8 BC), helpstring("IGrid 1 Interface"), pointer_default(unique) ] interface IGrid 1 : IUnknown { import "unknwn. idl"; HRESULT get([in] SHORT n, [in] SHORT m, [out] LONG *value); HRESULT set([in] SHORT n, [in] SHORT m, [in] LONG value); }; // uuid and definition of IGrid 2 [ object, uuid(3 CFDB 284 -CCC 5 -11 D 0 -BA 0 B-00 A 0 C 90 DF 8 BC), helpstring("IGrid 2 Interface"), pointer_default(unique) ] interface IGrid 2 : IUnknown { import "unknwn. idl"; HRESULT reset([in] LONG value); }; // uuid and definition of type library [ uuid(3 CFDB 281 -CCC 5 -11 D 0 -BA 0 B-00 A 0 C 90 DF 8 BC), version(1. 0), helpstring("grid 1. 0 Type Library) ] library GRIDLib { importlib("stdole 32. tlb"); // uuid and definition of class [ uuid(3 CFDB 287 -CCC 5 -11 D 0 -BA 0 B-00 A 0 C 90 DF 8 BC), helpstring("Grid Class") ] // multiple interfaces coclass CGrid { [default] interface IGrid 1; interface IGrid 2; }; DCOM IDL interface grid 1 { long get(in short n, in short m); void set(in short n, in short m, in long value); }; interface grid 2 { void reset(in long value); }; // multiple inheritance of interfaces interface grid: grid 1, grid 2 { }; CORBA IDL
#include "grid. h" // IDL-generated interface header file #include "grid. hh" // IDL-generated interface header file class CClass. Factory : public IClass. Factory { public: // IUnknown STDMETHODIMP Query. Interface(REFIID riid, void** ppv); STDMETHODIMP_(ULONG) Add. Ref(void) { return 1; }; STDMETHODIMP_(ULONG) Release(void) { return 1; } // IClass. Factory STDMETHODIMP Create. Instance(LPUNKNOWN punk. Outer, REFIID iid, void **ppv); STDMETHODIMP Lock. Server(BOOL f. Lock) { return E_FAIL; }; }; class CGrid : public IGrid 1, public IGrid 2 { public: // IUnknown STDMETHODIMP Query. Interface(REFIID riid, void** ppv); STDMETHODIMP_(ULONG) Add. Ref(void) { return Interlocked. Increment(&m_c. Ref); } STDMETHODIMP_(ULONG) Release(void) { if (Interlocked. Decrement(&m_c. Ref) == 0) { delete this; return 0; } return 1; } // IGrid 1 STDMETHODIMP get(IN SHORT n, IN SHORT m, OUT LONG *value); STDMETHODIMP set(IN SHORT n, IN SHORT m, IN LONG value); // IGrid 2 STDMETHODIMP reset(IN LONG value); CGrid(SHORT h, SHORT w); ~CGrid(); private: LONG m_c. Ref, **m_a; SHORT m_height, m_width; }; DCOM server class definition class grid_i : public grid. BOAImpl { public: virtual CORBA: : Long get(CORBA: : Short n, CORBA: : Short m, CORBA: : Environment &env); virtual void set(CORBA: : Short n, CORBA: : Short m, CORBA: : Long value, CORBA: : Environment &env); virtual void reset(CORBA: : Long value, CORBA: : Environment &env); grid_i(CORBA: : Short h, CORBA: : Short w); virtual ~grid_i(); private: CORBA: : Long **m_a; CORBA: : Short m_height, m_width; }; CORBA server class definition
#include "cgrid. h" #include "grid_i. h" STDMETHODIMP CClass. Factory: : Query. Interface(REFIID riid, void** ppv) { if (riid == IID_IClass. Factory || riid == IID_IUnknown) { *ppv = (IClass. Factory *) this; Add. Ref(); return S_OK; } *ppv = NULL; return E_NOINTERFACE; } STDMETHODIMP CClass. Factory: : Create. Instance(LPUNKNOWN p, REFIID riid, void** ppv) { IGrid 1* punk = (IGrid 1*) new CGrid(100, 100); HRESULT hr = punk->Query. Interface(riid, ppv); punk->Release(); return hr; } STDMETHODIMP CGrid: : Query. Interface(REFIID riid, void** ppv) { if (riid == IID_IUnknown || riid == IID_IGrid 1) *ppv = (IGrid 1*) this; else if (riid == IID_IGrid 2) *ppv = (IGrid 2*) this; else { *ppv = NULL; return E_NOINTERFACE; } Add. Ref(); return S_OK; } STDMETHODIMP CGrid: : get(IN SHORT n, IN SHORT m, OUT LONG* value) { } STDMETHODIMP CGrid: : set(IN SHORT n, IN SHORT m, IN LONG value) { } STDMETHODIMP CGrid: : reset(IN LONG value) { } CGrid: : CGrid(SHORT h, SHORT w) { m_c. Ref = 1; } extern HANDLE hevt. Done; CGrid: : ~CGrid () { Set. Event(hevt. Done); } DCOM server implementation CORBA: : Long grid_i: : get(CORBA: : Short n, CORBA: : Short m, CORBA: : Environment &) { return m_a[n][m]; } void grid_i: : set(CORBA: : Short n, CORBA: : Short m, CORBA: : Long value, CORBA: : Environment &) { m_a[n][m] = value; } void grid_i: : reset(CORBA: : Long value, CORBA: : Environment &) { } grid_i: : grid_i(CORBA: : Short h, CORBA: : Short w) { } grid_i: : ~grid_i () { } CORBA server implementation
HANDLE hevt. Done; void main() { // Event used to signal this main thread hevt. Done = Create. Event(NULL, FALSE, NULL); hr = Co. Initialize. Ex(NULL, COINIT_MULTITHREADED); CClass. Factory* pcf = new CClass. Factory; hr = Co. Register. Class. Object(CLSID_CGrid, pcf, CLSCTX_SERVER, REGCLS_MULTIPLEUSE , &dw. Register); // Wait until the event is set by CGrid: : ~CGrid() Wait. For. Single. Object(hevt. Done, INFINITE); Close. Handle(hevt. Done); Co. Uninitialize(); } int main() { // create a grid object using the implementation class grid_i our. Grid(100, 100); try { // tell Orbix that we have completed the server's initialization: CORBA: : Orbix. impl_is_ready("grid"); } catch (. . . ) { cout << "Unexpected exception" << endl; exit(1); } } DCOM server code #include "grid. h" CORBA server code #include "grid. hh" void main(int argc, char**argv) { IGrid 1 *p. IGrid 1; IGrid 2 *p. IGrid 2; LONG value; Co. Initialize(NULL); // initialize COM Co. Create. Instance(CLSID_CGrid, NULL, CLSCTX_SERVER, IID_IGrid 1, (void**) &p. IGrid 1); p. IGrid 1 ->get(0, 0, &value); p. IGrid 1 ->Query. Interface(IID_IGrid 2, (void**) &p. IGrid 2); p. IGrid 1 ->Release(); p. IGrid 2 ->reset(value+1); p. IGrid 2 ->Release(); Co. Uninitialize(); void main (int argc, char **argv) { grid_var grid. Var; CORBA: : Long value; // bind to "grid" object; Orbix-specific grid. Var = grid: : _bind(": grid"); value = grid. Var->get(0, 0); grid. Var->reset(value+1); } } DCOM client code CORBA client code
- Slides: 40