Kap 3.4 - 1OHO-Workshop: MTS - COM‘s OTM T. Grabs
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+?Thanks to Mary Kirtland that contributed some of the slides
Kap 3.4 - 2OHO-Workshop: MTS - COM‘s OTM T. Grabs
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 Klassen Objekte Laufzeitumgebung Account
IAccount vptr Debit()
Credit()
Kap 3.4 - 3OHO-Workshop: MTS - COM‘s OTM T. Grabs
Interfaces
COM ist schnittstellen-orientiert Schnittstellenvererbung vs. Quellcodevererbung Schnittstellendefinitions-Sprache Microsoft IDL 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
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);
};
Remote ProxyAccount
IAccount
Kap 3.4 - 4OHO-Workshop: MTS - COM‘s OTM T. Grabs
IDL-Compiler
Account.idlTypen und Schnittstellen
MIDL.EXE
Account.hC/C++-Typ-Definitionen
Account_I.cGUID-
Definitionen
Account.tblTyp-Bib. für VB und Java
Account_P.cSchnittstellen-Definitionen
dlldata.cSchnittstellen-
Marshaler
Kap 3.4 - 5OHO-Workshop: MTS - COM‘s OTM T. Grabs
IUnknown-Interface
COM-Standard-Interface: Jedes COM-Objekt muss es unterstützen, sonst ist es kein COM-
Objekt Schnittstellen-Navigation ermöglichen Referenzzählung auf Schnittstellen
IDL für IUnknown
interface IUnknown
{
HRESULT QueryInterface(
[in] REFIID riid, // the interface asked for
[out, iid_is(riid)] void **ppvObject);
ULONG AddRef();
ULONG Release();
}
Kap 3.4 - 6OHO-Workshop: MTS - COM‘s OTM T. Grabs
Interface-Anfrage
Anfrage an ein gegebenes Objekt, ob es ein Interface Account unterstützt
void GetAndUseAccount(IUnknown * pObj) {
IAccount * pAccount;
HRESULT hr
hr = pObj->QueryInterface(IID_IAccount, (void**)&pAccount);
if (hr == S_OK)
pAccount->Debit(1000, (double)23.75);
pAccount->Release();
}
Unter Verwendung von SmartPointers
CComPtr<IAccount> account_from;
account_from.CoCreateInstance(OLESTR("Transfer.Account"));
hr = account_from->Debit(1000, (double)23.75);
Kap 3.4 - 7OHO-Workshop: MTS - COM‘s OTM T. Grabs
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
Kap 3.4 - 8OHO-Workshop: MTS - COM‘s OTM T. Grabs
Laufzeitumgebung Wir verwenden wieder unser Transfer(Debit-Credit)-Beispiel
Server A Server B
Client.exe
Remote ProxyAccount
Service Control Manager
Accounts.exe
OLE32.dllOLE32.dll
Local ProxyAccount
Extern ObjectAccount
IAccount
Accounts.dll
IAccountIAccount
Local ObjectAccount
IAccount
RPC
Accounts.exe
OLE32.dll
Local ProxyAccount
IAccount
RPC
Service Control ManagerRPC
Kap 3.4 - 9OHO-Workshop: MTS - COM‘s OTM T. Grabs
In-Process Creation
Client ProcessClient Process
ClientClient
COM RuntimeCOM Runtime
11
SCMSCM22
RegistryRegistry{CLSID}{CLSID} Server.DLLServer.DLL
ComponentComponent
33
55
objectobject 44
Kap 3.4 - 10OHO-Workshop: MTS - COM‘s OTM T. Grabs
Remote Creation
Surrogate ProcessSurrogate Process
ComponentComponent
55
ISurrogateISurrogate
ClientClient
COM RuntimeCOM Runtime
11
SCMSCM22
RegistryRegistry{AppID}{AppID} RemoteServerNameRemoteServerName
3344
COM RuntimeCOM Runtime
SCMSCM
77
{CLSID}{CLSID} Server.DLLServer.DLL
RegistryRegistry{AppID}{AppID} DllSurrogateDllSurrogate
objectobject 66
Kap 3.4 - 11OHO-Workshop: MTS - COM‘s OTM T. Grabs
Methoden-Aufruf
Client ProcessClient Process
COMCOM
ClientClientAppApp
In-ProcessIn-ProcessServerServer
In-ProcessIn-ProcessObjectObject
RPCRPC
Local Server ProcessLocal Server Process
LocalLocalObjectObjectProxyProxy
Local ServerLocal Server
LocalLocalObjectObject
COMCOM
StubStub
Remote Server MachineRemote Server MachineRemoteRemoteObjectObjectProxyProxy
RPCRPC
Remote Server ProcessRemote Server Process
Remote ServerRemote Server
RemoteRemoteObjectObject
COMCOM
StubStub
Kap 3.4 - 12OHO-Workshop: MTS - COM‘s OTM T. Grabs
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 2PC-Koordination für verteilte Transaktionen
Objektkontext speichert Transaktionszustand eines Objektes Subtransaktionen erben den Kontext der Vatertransaktion Objekte innerhalb einer Transaktion entscheiden über
Commit: SetComplete()-Methode des Kontext-Interfaces Abort: SetAbort()-Methode des Kontext-Interfaces
Kap 3.4 - 13OHO-Workshop: MTS - COM‘s OTM T. Grabs
Objekterzeugungmit MTS
MTS SurrogateMTS Surrogate
33
MTS ExecutiveMTS Executive
44ClientClient
77
ComponentComponent
55
Context Context wrapperwrapper
Object Object contextcontext
88
99
COM RuntimeCOM Runtime
11
SCMSCM22RegistryRegistry
{CLSID}{CLSID} MTX MTX {package}{package}
Class Class factory factory
wrapperwrapper
66 Class Class objectobject
Kap 3.4 - 14OHO-Workshop: MTS - COM‘s OTM T. Grabs
Objekt-Kontexte
MTS SurrogateMTS Surrogate
MTS ExecutiveMTS Executive ComponentComponent
Class Class objectobject
Context Context wrapperwrapper
Class Class factory factory
wrapperwrapper
Object Object contextcontext
Object contextObject context
MTS CatalogMTS Catalog
Creator IDCreator ID
ActivityActivity
TransactionTransaction
Security PropertiesSecurity Properties
Kap 3.4 - 15OHO-Workshop: MTS - COM‘s OTM T. Grabs
Sub-Objekt bzw.Subtransaktion
MTS Surrogate ProcessMTS Surrogate Process
MTS ExecutiveMTS Executive Sub ComponentSub Component
Class Class objectobjectClass factory Class factory
wrapperwrapper
ComponentComponent
ObjectObject
Object ContextObject Context
11
MTS CatalogMTS Catalog
22
Context Context wrapperwrapper
Object Object contextcontext
33
44
Kap 3.4 - 16OHO-Workshop: MTS - COM‘s OTM T. Grabs
Methoden-Aufruf
MTS Surrogate ProcessMTS Surrogate Process
MTS ExecutiveMTS Executive ComponentComponent
Class Class objectobject
Context Context wrapperwrapper
Object Object contextcontext
ClientClient11
22
ObjectObject33
Kap 3.4 - 17OHO-Workshop: MTS - COM‘s OTM T. Grabs
Code-BeispielTransfer()
try {
HRESULT hr;
CComPtr<IAccount> account_credit;
m_spObjectContext->CreateInstance(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_spObjectContext->SetComplete();
return S_OK;
}
catch(HRESULT hr) {
// abort
m_spObjectContext->SetAbort();
return S_FALSE;
}
Kap 3.4 - 18OHO-Workshop: MTS - COM‘s OTM T. Grabs
Demo
Kap 3.4 - 19OHO-Workshop: MTS - COM‘s OTM T. Grabs
TUXEDOzum Vergleich
// add the transfer info to the send buffers
// Withdraw buffer must have account number and amount
if ((ret = Fchg(combuf1, FROMACC_ID, -1, (char*)&fromacc_id, 0)) < 0)
fprintf(stderr, "Client couldn't add field to communication buffer! error: %d\n", Ferror);
if ((ret = Fchg(combuf1, AMOUNT, -1, (char*)&amount, 0)) < 0)
fprintf(stderr, "Client couldn't add field to communication buffer! error: %d\n", Ferror);
// Deposit buffer must have account number and amount
if ((ret = Fchg(combuf2, TOACC_ID, -1, (char*)&toacc_id, 0)) < 0)
fprintf(stderr, "Client couldn't add field to communication buffer! error: %d\n", Ferror);
if ((ret = Fchg(combuf2, AMOUNT, -1, (char*)&amount, 0)) < 0)
fprintf(stderr, "Client couldn't add field to communication buffer! error: %d\n", Ferror);
Kap 3.4 - 20OHO-Workshop: MTS - COM‘s OTM T. Grabs
TUXEDOzum Vergleich
// start global transaction
if (tpbegin(20, 0) == -1)
{
userlog("Can't start TX\n");
userlog("Tperrno = %s\n", strerror(tperrno));
}
/* Request the service WITHDRAW, waiting for a reply */
ret = tpcall("WITHDRAW", (char*)combuf1, 0, (char**)&recbuf1, &reclen, (long)0);
if(ret == -1) {
userlog("Can't send request to service WITHDRAW\n");
userlog("Tperrno = %s\n", strerror(tperrno));
tpabort(0);
tpfree((char*)combuf1);
tpfree((char*)recbuf1);
tpfree((char*)combuf2);
tpfree((char*)recbuf2);
tpreturn(TPFAIL, 0L, (char*)NULL, 0L, 0L);
}
Kap 3.4 - 21OHO-Workshop: MTS - COM‘s OTM T. Grabs
TUXEDO zum Vergleich
ret = tpcall("DEPOSIT", (char*)combuf2, 0, (char**)&recbuf2, &reclen, (long)0);
if(ret == -1) {
userlog("Can't send request to service DEPOSIT\n");
userlog("Tperrno = %s\n", strerror(tperrno));
tpabort(0);
tpfree((char*)combuf1);
tpfree((char*)recbuf1);
tpfree((char*)combuf2);
tpfree((char*)recbuf2);
tpreturn(TPFAIL, 0L, (char*)NULL, 0L, 0L);
}
// try to commit
if (tpcommit(0) == -1)
{
userlog("Can't commit TX\n");
userlog("Tperrno = %s\n", strerror(tperrno));
tpreturn(TPFAIL, 0L, (char*)NULL, 0L, 0L);
}
else
userlog("Successfully committed TX\n");
Kap 3.4 - 22OHO-Workshop: MTS - COM‘s OTM T. Grabs
TUXEDO vs. MTS
Kriterium TUXEDO COM/MTS
ProgrammierungObjektorientiert -- +
Transaktionsmgt.Verteiltes 2PC + +Alternative TM - -KommunikationSynchron + +Asynchron + -Routing + ?Komplexe Datentypen + +
Load BalancingStatisch + +Dynamisch + -
Kap 3.4 - 23OHO-Workshop: MTS - COM‘s OTM T. Grabs
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
Kap 3.4 - 24OHO-Workshop: MTS - COM‘s OTM T. Grabs
Weitere Informationenzu COM, MTS und COM+
COM:http://www.microsoft.com/com/tech/com.asp
DCOM:http://www.microsoft.com/com/tech/DCOM.asp
MTS:http://www.microsoft.com/com/tech/MTS.asp
Applikationsentwicklung mit COM und MTS:http://msdn.microsoft.com/library/techart/dw1intro.htm
COM+:http://www.microsoft.com/com/tech/COMPlus.asp
(Stand: 19.4.2000)