COM+CRM-Betriebsprozess

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

Um auf das COM+ CRM zuzugreifen, ruft der CRM-Mitarbeiter zuerst die ICrmLogControl-Schnittstelle ab, mit der der CRM-Mitarbeiter Datensätze in das dauerhafte Protokoll schreiben kann. Der CRM-Mitarbeiter ruft diese Schnittstelle ab, indem eine CRM-Mitarbeiterkomponente erstellt wird.

Als Nächstes muss der CRM-Mitarbeiter den Namen des CRM-Kompensors mitteilen, den er verwenden möchte. Dies erfolgt durch Aufrufen der ICrmLogControl::RegisterCompensator-Methode . Nachdem diese Methode aufgerufen wurde, wird der CRM-Kompensor von der CRM-Infrastruktur erstellt, wenn die Transaktion abgeschlossen ist.

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

Außerdem bedeutet das Schreiben voraus, dass der CRM-Kompensor, der die Protokolldatensätze für die Wiederherstellung empfängt, den Fall behandeln muss, in dem die Protokolldatensätze geschrieben wurden, aber die Aktion nicht tatsächlich auftritt. Aktionen des CRM-Ausgleichs müssen idempotent sein; das heißt, sie sollten mehr als einmal durchgeführt werden können, aber zu demselben Ergebnis führen. Das Festlegen eines Kontoguthabens auf den Wert von $100 ist beispielsweise eine idempotente Aktion; Das Hinzufügen von $100 zum Kontoguthaben ist nicht erforderlich.

Die ICrmLogControl-Schnittstelle stellt die folgenden beiden Methoden zum Schreiben von Protokolldatensätzen bereit:

  • WriteLogRecordVariants wird verwendet, um einen strukturierten Protokolldatensatz zu schreiben, der als Sammlung von Variants aufgebaut ist. Es ist in erster Linie für die Entwicklung von CRMs in Microsoft Visual Basic zu verwenden.
  • WriteLogRecord wird zum Schreiben eines unstrukturierten Protokolldatensatzes als BLOBs von Bytes verwendet. Es ist in erster Linie für die Entwicklung von CRMs in Microsoft Visual C++ erforderlich. Da Datensatzstrukturen in C häufig aus einer Reihe von Kopfzeilen und Feldern bestehen, die möglicherweise im Arbeitsspeicher gestreut werden, implementiert die WriteLogRecord-Methode eine Sammlungsfunktion, die das Kopieren von Daten reduziert.

Hinweis

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

 

Beide Schreibmethoden schreiben einen Protokolldatensatz auf datenträger, garantieren jedoch nicht die Haltbarkeit des Datensatzes. Während lazy-Schreibvorgänge gesammelt werden können, bevor sie zum Datenträger gezwungen werden können, die Leistung zu verbessern, können Sie stattdessen die ICrmLogControl::ForceLog-Methode verwenden, um sicherzustellen, dass alle Schreibvorgänge, die vom CRM durchgeführt werden, auf dem Datenträger dauerhaft sind, was für die Fehlerwiederherstellung wichtig ist.

Wenn der CRM-Mitarbeiter mit seinen Aktionen fertig ist und das Schreiben und Erzwingen von Datensätzen zum Protokoll abgeschlossen ist, muss ICrmLogControl freigegeben werden. Wenn die Transaktion abgeschlossen ist (normalerweise aufgrund der Anwendungskomponente, die SetComplete oder SetAbort aufruft), erstellt die CRM-Infrastruktur die CRM-Kompensorkomponente, 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 an den CRM-Kompensor zusammen mit den Transaktionsergebnisbenachrichtigungen zu übergeben.

Der CRM-Kompensor wird zunächst über die Vorbereitungsphase der Transaktion informiert und kann entweder ja oder nein für die Vorbereitungsanfrage stimmen. Wenn der CRM-Ausgleich nein stimmt, erhält er keine weiteren Abbruchbenachrichtigungen. Wenn sie ja für die Vorbereitungsanfrage stimmt, erhält sie entweder die Commit- oder Abbruchbenachrichtigungen. Bei Abbruch eines Clients werden keine Vorbereitungsbenachrichtigungen empfangen, nur Abbruchbenachrichtigungen. Der CRM-Kompensor muss bereit sein, alle diese Fälle zu behandeln, und es muss auch den Fall behandeln, in dem keine Protokolldatensätze erfolgreich vom CRM-Mitarbeiter geschrieben wurden. Der CRM-Kompensor darf nicht davon ausgehen, dass die gleiche CRM-Kompensorinstanz sowohl die Phase 1 (Vorbereiten) als auch die Phase 2 (Commit- oder Abbruchbenachrichtigungen) empfängt, da diese durch die Wiederherstellung unterbrochen werden könnten.

In der Regel verwendet ein CRM-Kompensor die Abbruchbenachrichtigung, um die Aktion, die vom CRM-Mitarbeiter ausgeführt wurde, rückgängig zu machen. Der CRM-Mitarbeiter kann einen bestimmten Zustand verlassen, wenn er seine Aktion rückgängig machen muss. Dieser Zustand kann möglicherweise vollständig in den Protokolldatensätzen enthalten sein, und wenn nicht, muss der CRM-Kompensor diesen Zustand bereinigen, wenn die Transaktion commits. Dies ist der Grund, warum der CRM-Kompensor die Commitbenachrichtigung empfängt. Der CRM-Kompensor wird nicht unter einer DTC-Transaktion ausgeführt.

Der CRM-Kompensor kann neue Datensätze protokollieren, wenn erforderlich, indem ICrmLogControl verwendet wird, das er empfängt, wie er erstellt wird. Sowohl der CRM-Mitarbeiter als auch der CRM-Kompensor kann auch den letzten Protokolldatensatz vergessen, den sie geschrieben haben, was möglicherweise erforderlich ist, um unnötige Wiederherstellung zu vermeiden.

COM+ Kompensierung Resource Manager Konzepte

COM+ CRM-Start und -Wiederherstellung