Kap 3 4 Microsoft Transaction Server als Beispiel
Kap. 3. 4 Microsoft Transaction Server als Beispiel eines OTM · Was ist COM/DCOM? · Microsoft Transaction Server: COM‘s OTM · Entwickeln von MTS-Applikationen · Vergleich TUXEDO vs. MTS · Was ist COM+? OHO-Workshop: MTS - COM‘s OTM Thanks to Mary Kirtland that contributed some of the slides T. Grabs Kap 3. 4 - 1
Was ist COM/DCOM ? · COM - Component Object Model -- DCOM - Distributed COM · Komponente: Binärcode, der eine wohldefinierte Funktionalität erbringt · COM: Binärer Standard für solche Komponenten Þ unabhängig von einer Programmiersprache Þ unabhängig vom gewählten Compiler Þ Schnittstellenvererbung i. Ggs. zu Quellcode-Vererbung · konkret: vptr/vtbl-Layout abstrakter C++-Klassen als Schnittstelle der Komponenten festgelegt · Roadmap der COM-Konzepte · Interfaces vptr Debit() IAccount · Klassen Credit() · Objekte Account · Laufzeitumgebung OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 2
Interfaces · · · COM ist schnittstellen-orientiert Schnittstellenvererbung vs. Quellcodevererbung Schnittstellendefinitions-Sprache Microsoft IDL: Interface Definition Language MS-IDL basiert auf OSF DCE RPC IDL also: RPC-Formulierung mit automatischer Netzwerktransparenz · Automatische Generierung von Proxy- und Stub-Code · Beispiel einer IDL-Deklaration IAccount Remote Proxy Account interface IAccount : IDispatch { [id(1), helpstring("method Debit")] HRESULT Debit([in] int account, [in] double amount); [id(2), helpstring("method Credit")] HRESULT Credit([in] int account, [in] double amount); }; OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 3
IDL-Compiler Account. idl Typen und Schnittstellen MIDL. EXE Account. h C/C++-Typ. Definitionen Account_I. c GUIDDefinitionen OHO-Workshop: MTS - COM‘s OTM Account. tbl Typ-Bib. für VB und Java Account_P. c Schnittstellen. Definitionen T. Grabs dlldata. c Schnittstellen. Marshaler Kap 3. 4 - 4
IUnknown-Interface · COM-Standard-Interface: · Jedes COM-Objekt muss es unterstützen, sonst ist es kein COMObjekt · Schnittstellen-Navigation ermöglichen · Referenzzählung auf Schnittstellen · IDL für IUnknown interface IUnknown { HRESULT Query. Interface( [in] REFIID riid, // the interface asked for [out, iid_is(riid)] void **ppv. Object); ULONG Add. Ref(); ULONG Release(); } OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 5
Interface-Anfrage · Anfrage an ein gegebenes Objekt, ob es ein Interface Account unterstützt void Get. And. Use. Account(IUnknown * p. Obj) { IAccount * p. Account; HRESULT hr hr = p. Obj->Query. Interface(IID_IAccount, (void**)&p. Account); if (hr == S_OK) p. Account->Debit(1000, (double)23. 75); p. Account->Release(); } · Unter Verwendung von Smart. Pointers CCom. Ptr<IAccount> account_from; account_from. Co. Create. Instance(OLESTR("Transfer. Account")); hr = account_from->Debit(1000, (double)23. 75); OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 6
Laufzeitumgebung · Prozessinterner Server (in-process server) · Komponente ist in DLL implementiert · DLL wird in den Client-Adressraum geladen · Prozessexterner Server (out-of-process server) · Komponente ist in EXE implementiert · Komponente ist in DLL implementiert · DLL wird in Surrogat geladen, bspw. MTX. EXE · Prozessexterne Server unterstützen auch remote Zugriffe OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 7
Laufzeitumgebung · Wir verwenden wieder unser Transfer(Debit-Credit)-Beispiel Accounts. exe Client. exe IAccount Remote Proxy Account IAccount RPC Local Proxy Accounts. exe Local Proxy Account IAccount RPC Extern Object Account OLE 32. dll Local Object Accounts. dll OLE 32. dll Service Control Manager Server A OHO-Workshop: MTS - COM‘s OTM RPC Service Control Manager Server B T. Grabs Kap 3. 4 - 8
In-Process Creation Client Process Client Component object 4 1 5 COM Runtime 2 SCM OHO-Workshop: MTS - COM‘s OTM 3 Registry {CLSID} Server. DLL T. Grabs Kap 3. 4 - 9
Remote Creation ISurrogate Client 1 Surrogate Process Component object 7 COM Runtime 2 Remote. Server. Name OHO-Workshop: MTS - COM‘s OTM 5 SCM 3 Registry {App. ID} 6 4 Registry {App. ID} Dll. Surrogate {CLSID} Server. DLL T. Grabs Kap 3. 4 - 10
Methoden-Aufruf Client Process Local Server Process In-Process Object Client App Stub In-Process Server RPC COM Local Object Local Server Local Object Proxy Remote Server Machine Remote Server Process Remote Object Proxy COM RPC Stub COM OHO-Workshop: MTS - COM‘s OTM T. Grabs Remote Object Remote Server Kap 3. 4 - 11
COM mit MTS · Man kann COM Komponenten transaktionelle Eigenschaften zuordnen, wenn man sie über MTS administriert · (Fast) jede COM-Komponente eigent sich für MTS · Was bietet MTS zusätzlich zu COM: · Transaktionsprimitive · Objektkontexte (mehr dazu unten) · Anbindung an Resource-Manager via XA · 2 PC-Koordination für verteilte Transaktionen · Objektkontext · speichert Transaktionszustand eines Objektes · Subtransaktionen erben den Kontext der Vatertransaktion · Objekte innerhalb einer Transaktion entscheiden über · Commit: Set. Complete()-Methode des Kontext-Interfaces · Abort: Set. Abort()-Methode des Kontext-Interfaces OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 12
Objekterzeugung mit MTS Surrogate 4 Client MTS Executive 9 5 Component Context wrapper 1 8 6 Object context Class factory wrapper Class object 7 COM Runtime 2 SCM OHO-Workshop: MTS - COM‘s OTM 3 Registry {CLSID} MTX {package} T. Grabs Kap 3. 4 - 13
Objekt-Kontexte Object context Creator ID Activity Transaction Security Properties MTS Surrogate MTS Executive Component Context wrapper Object context Class factory wrapper Class object MTS Catalog OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 14
Sub-Objekt bzw. Subtransaktion MTS Surrogate Process MTS Executive Component Object Context wrapper 4 1 2 Object Context Sub Component Object context 3 Class factory wrapper Class object MTS Catalog OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 15
Methoden-Aufruf MTS Surrogate Process Client MTS Executive 1 Component Context wrapper 3 Object context OHO-Workshop: MTS - COM‘s OTM 2 T. Grabs Object Class object Kap 3. 4 - 16
Code-Beispiel Transfer() try { HRESULT hr; CCom. Ptr<IAccount> account_credit; m_sp. Object. Context->Create. Instance(CLSID_Account, IID_IAccount, (void**)&account_credit); hr = account_credit->Credit(account_to, amount); if (hr != S_OK) throw hr; // … do the same for debit // commit m_sp. Object. Context->Set. Complete(); return S_OK; } catch(HRESULT hr) { // abort m_sp. Object. Context->Set. Abort(); return S_FALSE; } OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 17
Demo OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 18
TUXEDO zum Vergleich // add the transfer info to the send buffers // Withdraw buffer must have account number and amount if ((ret = Fchg(combuf 1, FROMACC_ID, -1, (char*)&fromacc_id, 0)) < 0) fprintf(stderr, "Client couldn't add field to communication buffer! error: %dn", Ferror); if ((ret = Fchg(combuf 1, AMOUNT, -1, (char*)&amount, 0)) < 0) fprintf(stderr, "Client couldn't add field to communication buffer! error: %dn", Ferror); // Deposit buffer must have account number and amount if ((ret = Fchg(combuf 2, TOACC_ID, -1, (char*)&toacc_id, 0)) < 0) fprintf(stderr, "Client couldn't add field to communication buffer! error: %dn", Ferror); if ((ret = Fchg(combuf 2, AMOUNT, -1, (char*)&amount, 0)) < 0) fprintf(stderr, "Client couldn't add field to communication buffer! error: %dn", Ferror); OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 19
TUXEDO zum Vergleich // start global transaction if (tpbegin(20, 0) == -1) { userlog("Can't start TXn"); userlog("Tperrno = %sn", strerror(tperrno)); } /* Request the service WITHDRAW, waiting for a reply */ ret = tpcall("WITHDRAW", (char*)combuf 1, 0, (char**)&recbuf 1, &reclen, (long)0); if(ret == -1) { userlog("Can't send request to service WITHDRAWn"); userlog("Tperrno = %sn", strerror(tperrno)); tpabort(0); tpfree((char*)combuf 1); tpfree((char*)recbuf 1); tpfree((char*)combuf 2); tpfree((char*)recbuf 2); tpreturn(TPFAIL, 0 L, (char*)NULL, 0 L); } OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 20
TUXEDO zum Vergleich ret = tpcall("DEPOSIT", (char*)combuf 2, 0, (char**)&recbuf 2, &reclen, (long)0); if(ret == -1) { userlog("Can't send request to service DEPOSITn"); userlog("Tperrno = %sn", strerror(tperrno)); tpabort(0); tpfree((char*)combuf 1); tpfree((char*)recbuf 1); tpfree((char*)combuf 2); tpfree((char*)recbuf 2); tpreturn(TPFAIL, 0 L, (char*)NULL, 0 L); } // try to commit if (tpcommit(0) == -1) { userlog("Can't commit TXn"); userlog("Tperrno = %sn", strerror(tperrno)); tpreturn(TPFAIL, 0 L, (char*)NULL, 0 L); } else userlog("Successfully committed TXn"); OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 21
TUXEDO vs. MTS OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 22
COM+ · COM+ ist COM und mehr für Windows 2000 · COM+ = COM + MTS + MSMQ + Component Services + anderes · Component Services · Asynchronous · Non-blocking calls · Queued Components (MSMQ) · Events · Pipes · Light-weight handlers · … andere Erweiterungen · Apartment Threading überarbeitet · Registrierung überarbeitet · Keine Unterschiede bei Objekterzeugung für MTS mehr OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 23
Weitere Informationen zu COM, MTS und COM+ · COM: http: //www. microsoft. com/tech/com. asp · DCOM: http: //www. microsoft. com/tech/DCOM. asp · MTS: http: //www. microsoft. com/tech/MTS. asp · Applikationsentwicklung mit COM und MTS: http: //msdn. microsoft. com/library/techart/dw 1 intro. htm · COM+: http: //www. microsoft. com/tech/COMPlus. asp (Stand: 19. 4. 2000) OHO-Workshop: MTS - COM‘s OTM T. Grabs Kap 3. 4 - 24
- Slides: 24