Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Event-driven programmazione con Amazon DocumentDB e Java
Event-driven la programmazione nel contesto di Amazon DocumentDB rappresenta un potente modello architetturale in cui le modifiche al database fungono da generatori di eventi principali che attivano la logica e i processi aziendali successivi. Quando i record vengono inseriti, aggiornati o eliminati in una raccolta DocumentDB, queste modifiche agiscono come eventi che avviano automaticamente vari processi, notifiche o attività di sincronizzazione dei dati a valle. Questo modello è particolarmente utile nei moderni sistemi distribuiti in cui più applicazioni o servizi devono reagire alle modifiche dei dati in tempo reale. Il meccanismo principale per implementare la programmazione basata sugli eventi in DocumentDB è costituito dai flussi di modifiche.
Nota
Questa guida presuppone che tu abbia abilitato i flussi di modifica su una raccolta con cui stai lavorando. Consulta Utilizzo dei flussi di modifiche con Amazon DocumentDB per scoprire come abilitare i flussi di modifica sulla raccolta.
Utilizzo dei flussi di modifica dall'applicazione Java
Il watch() metodo del driver Java di MongoDB è il meccanismo principale per monitorare le modifiche ai dati in tempo reale in Amazon DocumentDB. Il watch() metodo può essere richiamato da MongoClientMongoDatabaseMongoCollection
Il watch() metodo restituisce un'istanza ChangeStreamIterable
ChangeStreamIterableIterable forEach() Per catturare gli eventi utilizzandoforEach(), passate una funzione di callback forEach() che elabori l'evento modificato. Il seguente frammento di codice mostra come aprire un flusso di modifica su una raccolta per avviare il monitoraggio degli eventi di modifica:
ChangeStreamIterable < Document > iterator = collection.watch(); iterator.forEach(event - > { System.out.println("Received a change: " + event); });
Un altro modo per visualizzare tutti gli eventi di modifica consiste nell'aprire un cursore che mantiene una connessione al cluster e riceve continuamente nuovi eventi di modifica non appena si verificano. Per ottenere un cursore dei flussi di modifica, utilizzate il metodo dell'oggetto. cursor() ChangeStreamIterable
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().cursor()) { System.out.println(cursor.tryNext()); }
Come procedura consigliata, è possibile creare l'istruzione MongoChangeStreamCursorcursor() metodo on ChangeStreamIterableMongoChangeStreamCursor oggetto. ChangeStreamDocument
La ChangeStreamDocumentgetOperationType() ad esempio per determinare il tipo di modifica, accedere getFullDocument() allo stato completo del documento e getDocumentKey() identificare il documento modificato.
L'ChangeStreamDocument
I token di curriculum e le operazioni basate sul tempo nei flussi di modifica di DocumentDB forniscono meccanismi cruciali per mantenere la continuità e gestire la cronologia degli accessi ai dati. Un token di curriculum è un identificatore univoco generato per ogni evento di modifica, che funge da segnalibro che consente alle applicazioni di riavviare l'elaborazione del flusso di modifiche da un punto specifico dopo disconnessioni o errori. Quando viene creato un cursore del flusso di modifiche, può utilizzare un token di curriculum precedentemente memorizzato tramite l'resumeAfter()opzione, consentendo allo stream di continuare dal punto in cui era stato interrotto anziché ricominciare dall'inizio o perdere eventi.
Time-based le operazioni nei flussi di modifica offrono approcci diversi per gestire il punto di partenza del monitoraggio degli eventi di modifica. L'startAtOperationTime()opzione consente di iniziare a guardare le modifiche avvenute in corrispondenza o dopo un determinato timestamp. Queste funzionalità basate sul tempo sono particolarmente utili in scenari che richiedono l'elaborazione di dati storici, il ripristino point-in-time o la sincronizzazione tra sistemi.
L'esempio di codice seguente recupera l'evento associato al documento di inserimento, ne acquisisce il token di curriculum e quindi fornisce quel token per avviare il monitoraggio degli eventi successivi all'evento di inserimento. L'evento è associato all'evento di aggiornamento, quindi ottiene l'ora del cluster in cui è avvenuto l'aggiornamento e utilizza tale timestamp come punto di partenza per ulteriori elaborazioni.
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()); }
Per impostazione predefinita, l'evento di modifica dell'aggiornamento non include il documento completo e include solo le modifiche apportate. Se è necessario accedere al documento completo che è stato aggiornato, è possibile chiamare il fullDocument() metodo sull'ChangeStreamIterable
Questo metodo accetta un FullDocumentUPDATE_LOOKUP valori. Il seguente frammento di codice mostra come richiedere il documento completo per gli eventi di aggiornamento quando si inizia a controllare le modifiche:
try (MongoChangeStreamCursor < ChangeStreamDocument < Document >> cursor = collection.watch().fullDocument(FullDocument.UPDATE_LOOKUP).cursor())