COM+ CRM-Betriebsprozess

Im normalen Betrieb würde eine Anwendungskomponente, die in einem Serveranwendungsprozess ausgeführt wird, ein COM+-CRM verwenden, indem sie einen CRM-Worker erstellt. Der CRM-Worker implementiert eine COM-Schnittstelle, die für die Aufgabe spezifisch ist, für die er konzipiert ist. Die Anwendungskomponente muss unter einer Transaktion ausgeführt werden, damit der CRM-Worker die Transaktion der Anwendungskomponente erbt. CRM-Mitarbeiter benötigen immer eine Transaktion.

Für den Zugriff auf com+ CRM ruft der CRM-Worker zuerst die ICrmLogControl-Schnittstelle ab, die es dem CRM-Worker ermöglicht, Datensätze in das dauerhafte Protokoll zu schreiben. Der CRM-Worker ruft diese Schnittstelle ab, indem er eine CRM-Mitarbeiterkomponente erstellt.

Als Nächstes muss der CRM-Mitarbeiter dem CRM-Sachbearbeiter den Namen des CRM-Kompensator mitteilen, den er verwenden möchte. Dazu wird die ICrmLogControl::RegisterCompensator-Methode aufgerufen. Nachdem diese Methode aufgerufen wurde, wird der CRM-Kompensator von der CRM-Infrastruktur erstellt, wenn die Transaktion abgeschlossen ist.

Nachdem der CRM-Worker seinen CRM-Kompensator registriert hat, kann er mithilfe von ICrmLogControl Datensätze in das CRM-Protokoll schreiben. Der CRM-Worker muss voranschreiben. Das heißt, es muss einen Datensatz in das Protokoll schreiben, das eine Aktion beschreibt, bevor die Aktion tatsächlich ausgeführt wird, falls unmittelbar nach Abschluss der Aktion ein Absturz auftritt. Ohne diese Schreibprotokolldatensätze gibt es keine Möglichkeit, die Aktion zu korrigieren.

Weiterschreiben bedeutet auch, dass der CRM-Kompensator, der die Protokolldatensätze bei der Wiederherstellung empfängt, den Fall behandeln muss, in dem die Protokolldatensätze geschrieben wurden, die Aktion jedoch nicht aufgetreten ist. Aktionen durch den CRM-Kompensator müssen idempotent sein; das heißt, sie sollten mehr als einmal durchgeführt werden können, aber zum gleichen Ergebnis führen. Beispielsweise ist das Festlegen eines Kontosaldos auf den Wert von 100 USD eine idempotente Aktion. Das Hinzufügen von $100 zum Kontosaldo ist nicht.

Die ICrmLogControl-Schnittstelle bietet die folgenden zwei Methoden zum Schreiben von Protokolldatensätzen:

  • WriteLogRecordVariants wird zum Schreiben eines strukturierten Protokolldatensatzes verwendet, der als Sammlung von Variants erstellt wird. Es ist in erster Linie für die Entwicklung von CRMs in Microsoft Visual Basic vorgesehen.
  • WriteLogRecord wird zum Schreiben eines unstrukturierten Protokolldatensatzes als BLOBs von Bytes verwendet. Es dient in erster Linie zur Verwendung bei der Entwicklung von CRMs in Microsoft Visual C++. Da Datensatzstrukturen in C häufig aus einem Satz von Headern und Feldern bestehen, die möglicherweise im Arbeitsspeicher verstreut sind, implementiert die WriteLogRecord-Methode eine Sammlungsfunktion, die das Kopieren von Daten reduziert.

Hinweis

Sie sollten keine Benutzerzeigertypen in Datenstrukturen in einem Protokolldatensatz verwenden. Zeiger sind während der Wiederherstellungsphase nicht mehr gültig, da der CRM-Kompensator in einem anderen Prozess als der CRM-Worker ausgeführt wird, der den Protokolldatensatz geschrieben hat. Das Einschließen von Zeigertypen in einen Protokolldatensatz kann dazu führen, dass eine Anwendung während der Wiederherstellung abstürzt oder sich selbst beschädigt.

 

Beide Schreibmethoden schreiben einen Protokolldatensatz auf den Datenträger, garantieren jedoch nicht die Dauerhaftigkeit des Datensatzes. Während die Kumulierung von verzögerten Schreibvorgängen vor dem Erzwingen auf dem Datenträger die Leistung verbessern kann, können Sie stattdessen die ICrmLogControl::ForceLog-Methode verwenden, um sicherzustellen, dass alle vom CRM ausgeführten Schreibvorgänge dauerhaft auf dem Datenträger sind, was für die Wiederherstellung von Fehlern wichtig ist.

Wenn der CRM-Worker mit seinen Aktionen fertig ist und das Schreiben und Erzwingen von Datensätzen in das Protokoll abgeschlossen hat, muss er ICrmLogControl freigeben. Wenn die Transaktion abgeschlossen ist (in der Regel aufgrund der Anwendungskomponente , die SetComplete oder SetAbort aufruft), erstellt die CRM-Infrastruktur die CRM-Kompensierungskomponente, die entweder die ICrmCompensator-Schnittstelle oder die ICrmCompensatorVariants-Schnittstelle implementiert. Diese Schnittstellen werden verwendet, um die unstrukturierten (Visual C++) oder strukturierten (Visual Basic) Datensätze zusammen mit den Transaktionsergebnisbenachrichtigungen an den CRM-Kompensator zu übergeben.

Der CRM-Kompensator wird zuerst über die Vorbereitungsphase des Transaktionsabschlusses benachrichtigt und kann entweder mit Ja oder Nein zur Vorbereitungsanfrage stimmen. Wenn der CRM-Kompensator nein stimmt, erhält er keine weiteren Abbruchbenachrichtigungen. Wenn sie mit Ja zur Vorbereitungsanforderung stimmt, erhält sie entweder die Commit- oder Abbruchbenachrichtigungen. Im Fall eines Clientabbruchs werden keine Vorbereitungsbenachrichtigungen empfangen, nur Abbruchbenachrichtigungen. Der CRM-Kompensator muss bereit sein, all diese Fälle zu behandeln, und er muss auch den Fall behandeln, in dem keine Protokolldatensätze vom CRM-Worker erfolgreich geschrieben wurden. Der CRM-Kompensator darf nicht davon ausgehen, dass derselbe CRM-Kompensator instance sowohl die Benachrichtigungen der Phase 1 (Vorbereitung) als auch die Benachrichtigungen der Phase 2 (Commit oder Abbruch) empfängt, da diese durch die Wiederherstellung unterbrochen werden könnten.

In der Regel verwendet ein CRM-Kompensator die Abbruchbenachrichtigung, um die aktion rückgängig zu machen, die vom CRM-Worker ausgeführt wurde. Der CRM-Worker kann einen zustand verfügbar lassen, falls er seine Aktion umkehren muss. Dieser Zustand kann vollständig in den Protokolldatensätzen enthalten sein, und wenn nicht, muss der CRM-Kompensator diesen Zustand sauber, wenn die Transaktion committ. Aus diesem Grund erhält der CRM-Kompensator die Commitbenachrichtigung. Der CRM-Kompensator wird nicht unter einer DTC-Transaktion ausgeführt.

Der CRM-Kompensator kann neue Datensätze bei Bedarf mithilfe von ICrmLogControl protokollieren, das er beim Erstellen empfängt. Sowohl der CRM-Worker als auch der CRM-Kompensator können auch den zuletzt geschriebenen Protokolldatensatz vergessen, was möglicherweise erforderlich ist, um unnötige Wiederherstellung zu vermeiden.

COM+ kompensierende Resource Manager-Konzepte

COM+ CRM-Start und -Wiederherstellung