Weitere Informationen zu IObservable- und IEnumerable-Schnittstellen in StreamInsight

Dieses Thema enthält weitere Informationen zum besseren Verständnis der Unterstützung für Observable- und Enumerable-Ereignisquellen und -senken in StreamInsight.

Unterstützung für die IObservable- und IObserver-Schnittstellen in StreamInsight

Übersicht über die IObservable- und IObserver-Schnittstellen

Die IObservable-Schnittstelle stellt die folgende Methode bereit:

Methode

Beschreibung

Subscribe

Erstellt ein Abonnement, von dem die IObserver-Schnittstelle implementiert wird, und gibt es zurück.

Die IObserver-Schnittstelle stellt die folgenden Methoden bereit:

Methode

Beschreibung

OnNext

Benachrichtigt das Observer-Objekt über einen neuen Wert in der Sequenz.

OnError

Benachrichtigt das Observer-Objekt, dass eine Ausnahme aufgetreten ist, und die Sequenz beendet wird.

Diesem Aufruf können keine Aufrufe von OnNext, OnCompleted oder OnError folgen.

OnCompleted

Benachrichtigt das Observer-Objekt über das Ende der Sequenz.

Diesem Aufruf können keine Aufrufe von OnNext, OnCompleted oder OnError folgen.

Dispose

Verwirft das Abonnement.

Eingabe von einer IObservable-Ereignisquelle

Beim Starten einer Abfrage, die an eine Observable-Eingabe gebunden ist, wird von StreamInsight die IObservable.Subscribe-Methode der Ereignisquelle aufgerufen, ein Abonnement wird erstellt, und von der Ereignisquelle werden Daten bereitgestellt. Von der Eingabe kann die normale Beendigung der Quelldaten durch den Aufruf des IObserver.OnCompleted-Elements gemeldet werden. Oder vom Benutzer kann die Eingabe beendet werden, indem das Abonnement verworfen wird.

Ausnahmen und Behandlung von Ausnahmen

Wenn von der StreamInsight-Abfrage eine Observable-Eingabe verwendet wird, müssen Sie nicht die Methoden der IObservable- oder IObserver-Schnittstellen im geschriebenen Code aufrufen. Die entsprechenden Methoden werden von StreamInsight aufgerufen. Die folgenden Informationen helfen allerdings beim Verständnis, wann Ausnahmen auftreten können und wie sie behandelt werden.

Der Eingabeadapter gewährleistet einen Verweis auf die Observable-Ereignisquelle, von der Ereignisse bereitgestellt werden.

  • Wird durch einen Aufruf von IObservable.Subscribe eine Ausnahme ausgelöst, wird die Ausnahme nicht an die StreamInsight-Laufzeit weitergeleitet, und die Abfrage wird abgebrochen.

  • Wenn der Aufruf des IObserver.Dispose-Elements eine Ausnahme auslöst, wird die Ausnahme protokolliert und ignoriert.

  • Durch den Aufruf eines IObserver.OnCompleted-Elements wird vom Eingabeadapter signalisiert, dass er beendet wurde. Aufrufe der IObserver-Methoden, die diesem Aufruf folgen, werden als Fehler behandelt und lösen möglicherweise Ausnahmen aus.

  • Durch Ausnahmen, die durch Aufrufe des IObserver.OnNext-Elements ausgelöst werden, wird die Abfrage abgebrochen und das Abonnement wird verworfen. Aufrufe der IObserver-Methoden, die diesem Aufruf folgen, werden als Fehler behandelt und lösen möglicherweise Ausnahmen aus. Eine Ausnahme nach dem Aufruf des OnNext-Elements kann durch Folgendes verursacht werden:

    • Ein NULL-Ereignis.

    • Eine CTI-Verletzung.

    • Eine durch einen Auswahlausdruck ausgelöste Ausnahme.

  • Durch den Aufruf des IObserver.OnNext-Elements erfolgt eine Blockierung, wobei der Datenstrom des Eingabeadapters voll ist und keine Ereignis in die Warteschlange eingereiht werden kann.

  • Durch Aufrufen des IObserver OnError-Elements wird die Abfrage abgebrochen. Aufrufe der IObserver-Methoden, die diesem Aufruf folgen, werden als Fehler behandelt und lösen möglicherweise Ausnahmen aus.

Ausgabe an IObservable-Ereignissenke

Wenn vom Observer-Objekt ein Abonnement durch Aufrufen der Subscribe-Methode einer IObservable-Ausgabe erstellt wird, wird eine Instanz einer Abfrage erstellt und gestartet, und von der vorübergehenden Ausgabe werden Daten bereitgestellt. Für jedes Abonnement besteht eine Abfrageinstanz, allerdings nur, wenn der Consumer vorhanden ist. Von StreamInsight kann die normale Beendigung einer Abfrage gemeldet werden, indem das IObserver.OnCompleted-Element aufgerufen wird. Oder die Abfrage kann vom Benutzer beendet und implizit gelöscht werden, indem das Abonnement verworfen wird. Entsprechend wird eine vorübergehende Abfrage erst gelöscht, wenn das entsprechende Abonnement verworfen wird.

Ausnahmen und Behandlung von Ausnahmen

Wenn Sie die Ausgabe einer StreamInsight-Abfrage anhand der IObservable- und IObserver-Schnittstellen verwenden, werden durch den in den Consumer geschriebenen Code die Methoden der Schnittstellen direkt aufgerufen. Die folgenden Informationen helfen beim Verständnis, wann Ausnahmen auftreten können und wie sie behandelt werden.

Wenn ein Datenstrom in eine IObservable-Ausgabe konvertiert wird, wird durch die Observable-Instanz ein Verweis auf den Originaldatenstrom gewährleistet. Danach können Observer-Objekte den Empfang von Daten abonnieren.

  • Durch den Aufruf des IObservable.Subscribe-Elements wird eine Abfrage erstellt und gestartet, und Ereignisse werden für das Observer-Objekt bereitgestellt. Durch das Subscribe-Element wird eine Ausnahme ausgelöst, wenn für eine der folgenden Bedingungen "true" festgelegt ist:

    • Der Server ist kein eingebetteter Server.

    • Die Abfrage kann nicht erstellt werden.

    • Die Abfrage kann nicht gestartet werden.

  • Durch den Aufruf des IObserver.Dispose-Elements wird die Abfrage beendet und anschließend gelöscht. Durch die Implementierung wird gewährleistet, dass für folgende Anweisungen "true" gilt:

    • Nachdem der Aufruf von Dispose zurückgegeben wird, werden keine weiteren Aufrufe der IObserver-Methoden durchgeführt.

    • Die zugrundeliegende Abfrage wird schnellstmöglich beendet und gelöscht, allerdings nicht unbedingt vor der Rückgabe durch den Dispose-Aufruf.

    • Durch den Aufruf von Dispose von einer IObserver-Methode wird kein Deadlock ausgelöst.

  • IObserver.OnError wird aufgerufen, wenn die Abfrage abgebrochen wird. Durch die Implementierung wird eine Ausnahme bereitgestellt, die mindestens Textinformationen zum Fehler enthält. Nach dem Aufrufen von OnError finden keine weiteren Aufrufe der IObserver-Methoden statt. OnError kann aufgerufen werden, wenn für eine der folgenden Bedingungen "true" gilt:

    • Von einem Adapter wird eine Ausnahme ausgelöst.

    • Von einem Operator wird eine Ausnahme ausgelöst.

  • IObserver.OnCompleted wird aufgerufen, wenn von der Abfrage die Verarbeitung der Ausgabe beendet wurde. Nach dem Aufrufen von OnCompleted finden keine weiteren Aufrufe der IObserver-Methoden statt. OnCompleted kann aufgerufen werden, wenn für eine der folgenden Bedingungen "true" gilt:

    • Der Ausgabeadapter empfängt ein CTI von Plus Unendlich.

    • Die Abfrage wird ausgesetzt, da alle Ereignisse verarbeitet wurden.

  • Wenn durch Aufrufe von StreamInsight in IObserver-Methoden (Aufrufe des Benutzercodes) eine Ausnahme ausgelöst wird, wird die Abfrage abgebrochen. Befand sich die Abfrage bereits im Abbruchprozess, wird die Ausnahme ignoriert.

  • Wenn von einem Auswahlausdruck eine Ausnahme ausgelöst wird, wird hierdurch die Abfrage abgebrochen.

Unterstützung für die IEnumerable-Schnittstelle in StreamInsight

Übersicht über die IEnumerable-Schnittstelle

Die IEnumerable-Schnittstelle stellt die folgende Methode bereit:

Methode

Beschreibung

GetEnumerator

Erstellt einen Enumerator, von dem die IEnumerator-Schnittstelle implementiert wird, und gibt ihn zurück.

Die IEnumerator-Schnittstelle stellt die folgenden Methoden bereit:

Methode

Beschreibung

Current

Ruft das aktuelle Element ab.

MoveNext

Verschiebt den Enumerator auf das nächste Element.

Reset

Legt den Enumerator auf seine Anfangsposition vor dem ersten Element fest.

Diesem Aufruf können keine weiteren Aufrufe von IEnumerator-Methoden folgen.

Dispose

Verwirft den Enumerator.

Eingabe von einer IEnumerable-Ereignisquelle

Beim Starten einer Abfrage, die an eine vorübergehende Eingabe gebunden ist, wird von StreamInsight die IEnumerable.GetEnumerator-Methode der Ereignisquelle aufgerufen und ein Enumerator abgerufen. Anschließend werden von der Ereignisquelle durch den Aufruf von IEnumerator.MoveNext und IEnumerator.Current in einer Schleife Daten bereitgestellt, so lange der Eingabedatenstrom nicht leer ist. Von der Eingabe kann die normale Beendigung der Quelldaten durch das Zurückgeben von "false" gemeldet werden, wenn von StreamInsight MoveNext aufgerufen wird. Oder vom Benutzer kann die Eingabe beendet werden, indem der Enumerator verworfen wird.

Ausnahmen und Behandlung von Ausnahmen

Wenn von der StreamInsight-Abfrage eine Enumerable-Eingabe verwendet wird, müssen Sie nicht die Methoden der IEnumerable- oder IEnumerator-Schnittstellen im geschriebenen Code aufrufen. Die entsprechenden Methoden werden von StreamInsight aufgerufen. Die folgenden Informationen helfen allerdings beim Verständnis, wann Ausnahmen auftreten können und wie sie behandelt werden.

Der Eingabeadapter gewährleistet einen Verweis auf eine Enumerable-Ereignisquelle, von der Ereignisse gezogen werden. Vom Eingabeadapter wird die Ereignisquelle für den eigenen Thread zum Abruf von Daten aufgerufen.

  • Wenn vom Aufruf von IEnumerable.GetEnumerator, IEnumerator.Current, IEnumerator.MoveNext oder IEnumerator.Dispose eine Ausnahme ausgelöst wird, wird hierdurch die Abfrage abgebrochen.

  • Wenn von einem Auswahlausdruck eine Ausnahme ausgelöst wird, wird hierdurch die Abfrage abgebrochen.

Ausgabe an IEnumerable-Ereignissenke

Wenn vom Consumer ein Enumerator durch Aufrufen der GetEnumerator-Methode einer IEnumerable-Ausgabe erstellt wird, wird eine Instanz einer Abfrage erstellt und gestartet, und von der vorübergehenden Ausgabe werden Daten bereitgestellt. Für jeden Enumerator besteht eine Abfrageinstanz, allerdings nur, wenn der Consumer vorhanden ist. Von StreamInsight kann die normale Beendigung einer Abfrage durch das Zurückgeben von "false" gemeldet werden, wenn vom Consumer IEnumerator.MoveNext aufgerufen wird. Oder die Abfrage kann vom Benutzer beendet und implizit gelöscht werden, indem der Enumerator verworfen wird. Entsprechend wird eine vorübergehende Abfrage erst gelöscht, wenn der entsprechende Enumerator verworfen wird.

Ausnahmen und Behandlung von Ausnahmen

Wenn Sie die Ausgabe einer StreamInsight-Abfrage anhand der IEnumerable- und IEnumerator-Schnittstellen verwenden, werden durch den in den Consumer geschriebenen Code die Methoden der Schnittstellen direkt aufgerufen. Die folgenden Informationen helfen beim Verständnis, wann Ausnahmen auftreten können und wie sie behandelt werden.

Wenn ein Datenstrom in eine IEnumerable-Ausgabe konvertiert wird, wird durch die Enumerable-Instanz ein Verweis auf den Originaldatenstrom gewährleistet. Von Consumern werden die IEnumerable- und IEnumerator-Methoden zum Ziehen von Daten verwendet.

  • Durch den Aufruf von IEnumerable.GetEnumerator wird eine Abfrage mit einem Ausgabeadapter erstellt, von dem Werte für die externe Quelle bereitgestellt werden. Von GetEnumerator kann eine Ausnahme ausgelöst werden, wenn für eine der folgenden Bedingungen "true" gilt:

    • Der Server ist kein eingebetteter Server.

    • Die Abfrage kann nicht erstellt werden.

    • Die Abfrage kann nicht gestartet werden (z. B. aufgrund fehlender Adapter).

  • Durch den Aufruf des IEnumerator.Dispose-Elements wird die Abfrage beendet und anschließend gelöscht. Durch die Implementierung wird sichergestellt, dass nach der Rückgabe des Dispose-Aufrufs keine weiteren Aufrufe der IEnumerator-Methoden stattfinden. Von Dispose kann eine Ausnahme ausgelöst werden, wenn für eine der folgenden Bedingungen "true" gilt:

    • Die Abfrage kann nicht beendet werden.

    • Die Abfrage kann nicht gelöscht werden.

  • Durch den Aufruf der Current-Methode kann eine Ausnahme ausgelöst werden, wenn MoveNext nicht wenigstens ein Mal aufgerufen wurde.

  • Ein Aufruf von MoveNext...

    • ... löst keine Ausnahmen aus.

    • ... gibt "true" zurück, so lange Daten für die Bereitstellung vorhanden sind.

    • ... gibt "false" zurück, wenn die Abfrage gestoppt oder abgebrochen wurde.

    • ... blockiert, wenn keine Ausgabedaten für die Bereitstellung vorhanden sind.