Techtalk April 2001 COM+ Services aus ATL Komponenten nutzen Martin Vollmer [email protected] Technologieberater Microsoft GmbH Agenda Basics, Basics, Basics ... OLE DB Consumer Templates COM+ Event Services COM+ Queued Components 2 Windows DNA Databases Legacy Systems Thin Client Rich Client External Applications Application Services 3 Windows DNA COM verbindet alles Tools User Interface & Navigation Basic HTML Dynamic HTML Forms Native COM HTML/Script Authoring Component Creation Management Business Process Web Server Transactions Message Queuing Security Integrated Storage File System Data Base Mail Store Directory Scripting Rapid Application Development Team Development Distributed Operating Environment Other Stores Networking Base Services 4 Die .NET Platform Visual Studio Studio.NET 6.0 Orchestration VS 6.0 Internet COM+ DNA Servers Internet Windows 2000 2nd Generation Available Today .NET Framework COM+ .NET Enterprise Servers Building Block Services Windows Windows.NET 2000 3rd Generation – the .NET Platform With .NET Enhancements New Capabilities 5 COM Programming Model Objects and Interfaces IUnknown IClassFactory Client Class Factory Object Registration Packaging Component 6 COM Vokabular Interface – abstrakter Datentyp verwendet vom Client um Objekte anzusprechen Klasse – konkreter Datentyp, geschrieben von Entwicklern, um ein oder mehrere Interfaces zu implementieren Objekt – Einheit im Speicher, welche ein oder mehrere Interfaces unterstützt (typischerweise die Instanz einer Klasse) Komponente – ladbares Code-Modul, welches eine oder mehrere COM Klassen implementiert GUID – 128-bit eindeutiger Bezeichner für ein Interface oder eine Klasse (oder etwas noch exotischeres) 7 Interface und Klassen [ uuid(F7C8C7B2-FEC7-11d2-AE59-006008D1A534), object] interface ICalculator : IUnknown { HRESULT Op([in] long n, [out, retval] long *pn); } [ uuid(F7C8C7B4-FEC7-11d2-AE59-006008D1A534), object] interface IClearable : IUnknown { HRESULT Clear(void); } [ uuid(F7C8C7B3-FEC7-11d2-AE59-006008D1A534)] coclass Adder { [default] interface ICalculator; interface IClearable } Dim calc as ICalculator Set calc = New Adder Dim clr as IClearable Set clr = calc clr.Clear n = calc.Op(35) Set calc = Nothing Set clr = Nothing ‘ ‘ ‘ ‘ ‘ ‘ ‘ ‘ declare interface-based reference use CoCreateInstance to load component declare interface-based reference use QueryInterface to coerce type invoke IClearable.Clear method invoke ICalculator.Op method release reference to object release reference to object 8 COM+ Programmiermodell IUnknown Context CreateInstance … OK: SetComplete … Err: SetAbort Attributes Client Server 9 Konfigurierte Komponenten Problem: Wenn es das Ziel ist, keinen oder so wenig wie möglich Code zu schreiben, wie konfiguriert man Interceptors, so dass sie ihre Arbeit so magisch verrichten ? Lösung: „Declarative attributes“ Klassen, welche besondere Services benötigen, müssen dies „declarative“ anzeigen COM+ führt den Begriff der configured components Konfigurierte Komponenten sind Klassen, die extended attributes haben, welche die Interception steuern Konfigurierte Komponenten sind immer DLLs • COM+ benutzt surrogate für remote/local activation 10 Attribute Im Catalog sind die Attribute abgelegt, welche die Laufzeit abfragt um einen Interceptor aufzubauen Die Menge der Attribute ist fest (bis jetzt !) Applications/Packages, Klassen, Interfaces und Methoden könne Attribute haben Attribute könne über den COM+/MTS Explorer gesetzt werden Es wird möglich sein alle Attribute aus der Entwicklungsumgebung zu setzen irgendwann … (VS .NET ) 11 Attribute: Applikationen Activation Type Authentication Level Impersonation Level Authorization Checks Security Identity Process Shutdown Debugger Enable Compensating Resource Managers Enable 3GB Support Queueing Library (inproc)/Server (surrogate) None, Connect, Call, Packet, Integrity, Privacy Identify, Impersonate, Delegate Application Only/Application + Component Interactive User/Hardcoded User ID + PW Never/N minutes after idle Command Line to Launch Debugger/Process On/Off On/Off Queued/Queued+Listener Was es bei MTS bereits gibt, ist unterstrichen 12 Attribute: Klassen, Interfaces & Methoden Transaction Non Supported, Supported, Required, Requires New Class Synchronization Non Supported, Supported, Required, Requires New Class Object Pooling On/Off, Max Instances, Min Instances, Timeout Class Declarative Construction Arbitrary Class-specific String Class JIT Activation On/Off Class On/Off Class On/Off Class Zero or more role names Class Interface Method Auto-Deactivate On/Off Method Must Activate in Activator’s Context On/Off Class Activation-time Load Balancing Instrumentation Events Declarative Authorization Was es bei MTS bereits gibt, ist unterstrichen 13 Data Access (Geschichte..) Application interface ADO DAO ODBC Direct RDO JET OLE DB Kagera ODBC API RDBMS SQL Server 14 Was ist OLE DB? OLE DB Organisation OLE DB ist eine Menge von Com Objekten Jedes Objekt umfasst mehrere verwandte Interfaces Provider müssen nicht alle Interfaces eines Objektes unterstützen DataSource Session Transaction Rowset Command Rowset 15 ATL Consumer Templates Ein “thin wrapper” um die OLE DB Objekte • • CDataSource, CSession, CRowset, etc. Dies ist kein neues Objekt Modell !! Aufgebaut im Stil der ATL • • • Performance Templates Erzeugt schlanke Executables Viel einfacher zu programmieren als OLE DB direkt zu nutzen 16 ATL Consumer Templates Struktur einer Applikation Dies sind die Objekte, welche man nutzt um eine Consumer Template Applikation zu schreiben. CDataSource CSession CTable or CCommand Accessor Rowset 17 ADO für Consumer ? Einfacheres Objektmodell als OLE DB Nutzt VARIANTS Kann auch in C++ einfach über #import eingebunden und genutzt werden ADO (MDAC) wird kontinuierlich weiterentwickelt. Visual Basic oder ASP 18 OLE DB für Consumer ? Volle Kontrolle über den Datenzugriff • • • Festelegen wie Speicher allokiert wird Festlegen wie Datentypen behandelt werden Festlegen der effektivsten Art um Daten zum Consumer zurückzuliefern High performance Minimal code size 19 Common Pitfalls CDataSource Funktion Open(): db.Open(_T("SQLOLEDB.1"), &dbinit); Ersetzen durch (KB Q190969): db.OpenWithServiceComponents(_T("SQLOL EDB.1"), &dbinit); Nur mit OpenWithServiceComponents(): • • • • Automatisches „Enlisten“ der Transaktion Resource Pooling Updating zu SQL Provider Scrolling, Find und Bookmarks bei minimalem OLE DB Provider 20 OLE DB Properties ? Welche Properties sind wie gesetzt von ADO ? Welche Properties müssen wie gesetzt sein um einen best. Cursortyp zu bekommen ? Zwei „exklusive“ Tools • • OLEDBPerformance ADO2OLEDB 21 OLE DB <-> ADO ? OLE DB im Middle Tier ! Client möchte aber einen Recordset ? Wie wandelt man einen OLE DB Rowswet in einen ADO Recorset ? Welche Properties muss man wie setzen um einen „disconnected“ Recordset zu erhalten ? 22 Transaktionen, COM+ Applikationen, ADO, OLE DB und der ganze Rest ... DEMO 23 Event Services LCE - Loosely Coupled Events 24 Klassisches Problem Bei verteilten Anwendungen • • Anbieten und auch Liefern von Informationen an einen oder mehrere Beteiligte ohne im Voraus von deren Identität zu wissen Zwei Arten von Programmen sind dabei involviert • • Das Eine hat die Information Das Andere braucht die Information 25 Event Services Ein Objekt benachrichtigen, wenn etwas „Interessantes“ passiert ist • • Objekte, die bereits laufen (transient) Objekte, die instanziiert werden, wenn das Ereigniss eintritt (persistent) Subscriber Publisher Event Service Subscriber Subscriber Administration Event Database 26 Event Services –Implementierung EventClass • • TypeLib für die Registrierung der Events, die gefeuert (fired) werden Registrierung im COM+ Katalog • • MMC SnapIn COM+ Component Service COM+ Admin API EventPublisher • • instanziiert EventClass Aufruf der entsprechenden Methoden (Fire) EventSubscriber • • Registriert im COM+ Katalog Abonniert (Subscription) die Ereignisse der Eventklasse • • Persistent oder Transient (nur per API) 27 Event Class Indirektion zwischen dem Publisher und dem Subscriber Über die Meta-Daten definiert (CLSID, ProgID, Typelib etc.) • Minimaler Codingaufwand von der Developer Seite aus • • DLL welche DllRegisterServer exportiert reicht schon Tybelib welche die “firing” Interfaces beschreibt 28 Event Class Wird vom COM+ EventSystem erzeugt • • V-Table Layout wird während der Laufzeit aufgesetzt Weiss welche Subscriptions für welche Methode vorhanden sind Kann beliebige Anzahl von “firing” Interfaces zur Verfügung stellen 29 Firing Interface Jede Methode kann 0 - N Subscriptions haben Subscriber stellt dieses Interface ebenfalls zur Verfügung Nur [in] Parameter als Methoden Argumente IStockEvents StockEvents.1 { 877E7998-E8EC-11D1-B994-00C04F990088 } interface IStockEvents { HRESULT StockPriceChange ( BSTR StockSymbol, double Price ); HRESULT NewStock ( BSTR StockSymbol, BSTR CompanyName ); HRESULT StockSymbolChanged (BSTR OldSymbol, BSTR NewSymbol ); HRESULT DowJonesUpdate ( double Current ); }; Subscriben auf individuelle Methoden eines “firing” Interface 30 Subscription Eine Subscription besteht aus folgenden Komponenten: • • • Einem EventClass Interface Einer spezifischen Methode innerhalb des EventClass Interfaces Einem Subscriber Der Subscriber kann eine CLSID, ein Moniker oder ein Interface Pointer sein Publisher Subscriber Event class Publisher EventClass StockPub StockEvents IID EventMethod Subscriber PublisherProperties IStockInt StockPriceChange StockSubscriber StockSymbol = “MSFT” 31 Event Filtering Die meisten Subscriber wollen nur eine Notification bekommen, wenn sich z.B. ein spezieller Aktienpreis ändert Dazu ist Filtering notwendig Publisher Event class Subscribers “MSFT” “RHAT” “INTC” interface IStockEvents { HRESULT StockPriceChange ( BSTR StockSymbol, double Price ); }; 32 Event Filtering - Arten Publisher Filtering • • • Filtering ist Aufgabe einer jeweiligen Filterkomponente Declarative (über den COM+ Explorer) • • • Gesetzt als Attribut der EventClass AttributeName == “MultiFilterPublisherCLSID” Filter wird vom COM+ EventSystem erzeugt wenn die EventClass vom Publisher instanziiert wird Laufzeit • • Wird vom Publisher aufgesetzt Verbunden mit der EventClass nachdem diese vom Publisher instanziiert wurde 33 Event Filtering Publisher Subscribers IStockEvents interface IStockEventsa { HRESULT StockPriceChange ( BSTR StockSymbol, double Price ); }; Publisher Publisher makes a method call IStockEvents EventClass COM+ Event System Service EventClass Method Subscriber StockSymbol = “MSFT” IStockEvents Publisher Filter COM+ EventSystem Store (EventClasses / Subscriptions) IMultiInterfacePublisherFilter 34 • EventClass in ATL • Subscriber in VB und/oder ATL (mal sehen ..) • Publisher in VB (geht einfach schneller) DEMO 35 Queued Components QC 36 Queued Components Für asynchrone und synchrone Kommunikation zwischen Objekten Kommunikation über Message Queues Viele Aufgaben müssen nicht synchron in einer Transaktion ausgeführt werden COM+ Infrastruktur • • Automatisches Einbinden der QueueVerarbeitung in den Transaktionskontext MSMQ stellt sicher, dass keine Nachrichten verloren gehen 37 Synchrone Verarbeitung via DCOM Client Order Shipping Order Shipping Transaktion 38 Asynchrone Verarbeitung Client Transaction 1 Transaction 3 MSMQ Order Shipping Order Ship 39 QC - Architektur Order Entry Shipping S = GetObject S.num = 1234 S.custid = 789 S.Line 10, widget RPC Recorder Queue Listener MSMQ RPC Player num property custid property Line method 40 Queued Components Design Keine synchronen Rückgabewerte Methoden können nur [ in ] Parameter verarbeiten Parameter müssen als Wert (ByVal) und nicht als Referenz/Pointer (ByRef) übergeben werden 41 QC – Rückgabewerte Via Message Queues Die Server Komponente schickt entsprechende Nachrichten über den Status der Verarbeitung • Ausnutzung der COM+ Infrastruktur 42 Asynchrone Verarbeitung Response Objekt Transaction 1 Client Order Transaction 2 Shipping Order Transaction 3 Notify Shipping 43 QC - Fehlerbehandlung Messages, die wiederholt Fehler verursachen werden in eine entsprechende Queue gestellt • • • • • • Problemanalyse – Fehlerbeseitigung – Zurückstellen in Queue Diagnose Informationen verarbeiten – Löschen Compensating Transaction ausführen Manuelle Behandlung mittels Tools IPlaybackControl Interface • • FinalClientRetry FinalServerRetry Was geschieht bei einer fehlerhaften Buchung eines Schecks ? 44 Remoteable Events Publisher Prozeß Subscriber Prozeß IStockEvents Subscriber Stock events Subscriber IStockEvents Maschine 1 Subscriber Prozeß Maschine 2 Subscriber IStockEvents 45 Bug in Windows 2000 Registry – Eintrag unter: HKLM\SOFTWARE\Microsoft\EventSystem\ {26c409cc-ae86-11d1-b61600805fc79216}\Subscriptions ist falsch für remote queued Subscriptions !! Key Subscribername ist: queue:computername=martinv:/new:{AC79 A87C-44B8-42AE-B7F5-C1D749538AE6} sollte aber: queue:computername=martinv/new:{AC79 A87C-44B8-42AE-B7F5-C1D749538AE6} 46 • Events asynchron über MSMQ (QC) DEMO 47 Fragen? Uff... 48 Mehr Informationen msdn online • • • www.microsoft.com/germany/msdn www.microsoft.com/dna www.msdnmagazine.com externe Links • • www.worldofatl.com www.codeguru.com/atl/index.shtml 49 Glossar API – Application Programming Interface: Definierte Programmierschnittstelle für den Zugriff auf Systemfunktionen ATL – Active Template Library: Bibliothek zur Erstellung vom COM(+) Komponenten mit Visual C++ IIS – Internet Information Server: Der Webserver von Microsoft ASP: Active Server Pages – Server-seitiges Scripting in IIS Context: Gruppe von Objekten in einem Prozess, welche aufgrund kompatibler Attribute (Anforderungen an die Laufzeitumgebung) zusammengefasst werden können DNA: Distributed InterNet Applicaltion Interception: Mechanismus um Aufrufe über Context-Grenzen hinweg, über „lightweight-proxies“ so aufzurufen, dass in der Methode des gerufenen Objekts der richtige Context zur Verfügung steht. IIS: Internet Information Server JITA: (Just in time activation) Mechanismus der es COM+ erlaubt eine Komponente zu deaktivieren, obwohl ein Client noch eine Referenz auf diese Komponente hat. Erst beim nächsten Methodenaufruf wird die Komponente erneut (just-in time) aktiviert. MTS: Microsoft Transaction Server MSMQ: Microsoft Message Queue Server 50