Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Event-driven Programmierung mit Amazon DocumentDB und Java
Event-driven Die Programmierung im Kontext von Amazon DocumentDB stellt ein leistungsstarkes Architekturmuster dar, bei dem Datenbankänderungen als primäre Ereignisgeneratoren dienen, die nachfolgende Geschäftslogik und Prozesse auslösen. Wenn Datensätze in eine DocumentDB-Sammlung eingefügt, aktualisiert oder gelöscht werden, wirken diese Änderungen als Ereignisse, die automatisch verschiedene nachgelagerte Prozesse, Benachrichtigungen oder Datensynchronisierungsaufgaben auslösen. Dieses Muster ist besonders nützlich in modernen verteilten Systemen, in denen mehrere Anwendungen oder Dienste in Echtzeit auf Datenänderungen reagieren müssen. Der primäre Mechanismus zur Implementierung ereignisgesteuerter Programmierung in DocumentDB sind Change Streams.
Anmerkung
In diesem Handbuch wird davon ausgegangen, dass Sie Change Streams für eine Sammlung aktiviert haben, mit der Sie gerade arbeiten. Weitere Informationen Change Streams mit Amazon DocumentDB verwenden zum Aktivieren von Change-Streams für die Sammlung finden Sie unter.
Arbeiten mit Change-Streams aus der Java-Anwendung
Die watch() Methode im Java-Treiber von MongoDB ist der primäre Mechanismus zur Überwachung von Datenänderungen in Amazon DocumentDB in Echtzeit. Die watch() Methode kann von Objekten MongoClientMongoDatabaseMongoCollection
Die watch() Methode gibt eine Instanz zurück ChangeStreamIterable
ChangeStreamIterableIterable und kann mit verwendet werden. forEach() Um Ereignisse mit zu erfassenforEach(), übergeben Sie eine Callback-FunktionforEach(), die das geänderte Ereignis verarbeitet. Der folgende Codeausschnitt zeigt, wie ein Change-Stream für eine Sammlung geöffnet wird, um die Überwachung von Änderungsereignissen zu starten:
ChangeStreamIterable < Document > iterator = collection.watch(); iterator.forEach(event - > { System.out.println("Received a change: " + event); });
Eine andere Möglichkeit, alle Änderungsereignisse zu durchlaufen, besteht darin, einen Cursor zu öffnen, der eine Verbindung zum Cluster aufrechterhält und kontinuierlich neue Änderungsereignisse empfängt, sobald sie auftreten. Um einen Change-Streams-Cursor zu erhalten, verwenden Sie die cursor() Methode object. ChangeStreamIterable
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().cursor()) { System.out.println(cursor.tryNext()); }
Es hat sich bewährt, entweder die Anweisung MongoChangeStreamCursorcursor() Methode aufrufen, wird eine ChangeStreamIterableMongoChangeStreamCursor, die über einem Objekt erstellt wurde. ChangeStreamDocument
Die ChangeStreamDocumentgetOperationType() um die Art der Änderung getFullDocument() zu bestimmen, auf den vollständigen Dokumentstatus zuzugreifen und das geänderte Dokument getDocumentKey() zu identifizieren.
Das ChangeStreamDocument
Resume-Token und zeitbasierte Operationen in DocumentDB-Change-Streams bieten entscheidende Mechanismen zur Aufrechterhaltung der Kontinuität und zur Verwaltung des Zugriffs auf historische Daten. Ein Resume-Token ist eine eindeutige Kennung, die für jedes Änderungsereignis generiert wird. Sie dient als Lesezeichen, das es Anwendungen ermöglicht, die Change-Stream-Verarbeitung nach Verbindungsabbrüchen oder Ausfällen von einem bestimmten Punkt aus neu zu starten. Wenn ein Change-Stream-Cursor erstellt wird, kann er über die resumeAfter() Option ein zuvor gespeichertes Resume-Token verwenden, sodass der Stream an der Stelle fortgesetzt werden kann, an der er aufgehört hat, anstatt am Anfang zu beginnen oder Ereignisse zu verlieren.
Time-based Operationen in Change-Streams bieten unterschiedliche Ansätze, um den Ausgangspunkt der Überwachung von Änderungsereignissen zu verwalten. Mit dieser startAtOperationTime() Option können Sie beginnen, Änderungen zu beobachten, die zu oder nach einem bestimmten Zeitstempel eingetreten sind. Diese zeitbasierten Funktionen sind besonders nützlich in Szenarien, in denen historische Daten verarbeitet, zu einem bestimmten Zeitpunkt wiederhergestellt oder zwischen Systemen synchronisiert werden müssen.
Im folgenden Codebeispiel wird das mit dem Einfügedokument verknüpfte Ereignis abgerufen, das zugehörige Resume-Token erfasst und dann dieses Token bereitgestellt, um mit der Überwachung von Ereignissen nach dem Insert-Ereignis zu beginnen. Das Ereignis wird dem Aktualisierungsereignis zugeordnet, ruft dann die Cluster-Uhrzeit ab, zu der die Aktualisierung stattgefunden hat, und verwendet diesen Zeitstempel als Ausgangspunkt für die weitere Verarbeitung.
BsonDocument resumeToken; BsonTimestamp resumeTime; try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().cursor()) { System.out.println("****************** Insert Document *******************"); ChangeStreamDocument < Document > insertChange = cursor.tryNext(); resumeToken = insertChange.getResumeToken(); printJson(cursor.tryNext()); } try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch() .resumeAfter(resumeToken) .cursor()) { System.out.println("****************** Update Document *******************"); ChangeStreamDocument < Document > insertChange = cursor.tryNext(); resumeTime = insertChange.getClusterTime(); printJson(cursor.tryNext()); } try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch() .startAtOperationTime(resumeTime) .cursor()) { System.out.println("****************** Delete Document *******************"); printJson(cursor.tryNext()); }
Standardmäßig umfasst das Aktualisierungsereignis nicht das gesamte Dokument und nur die vorgenommenen Änderungen. Wenn Sie auf das komplette Dokument zugreifen müssen, das aktualisiert wurde, können Sie die fullDocument() Methode für das ChangeStreamIterable
Diese Methode verwendet eine FullDocumentUPDATE_LOOKUP Werte. Der folgende Codeausschnitt zeigt, wie Sie das vollständige Dokument für Aktualisierungsereignisse anfordern, wenn Sie beginnen, auf Änderungen zu achten:
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().fullDocument(FullDocument.UPDATE_LOOKUP).cursor())