public void start(String database, Set<String> collections, BsonDocument resumeToken) {
MongoClient mongoClient = getMongoClient();
MongoDatabase db = mongoClient.getDatabase(database).withReadPreference(ReadPreference.secondary());
// 构建pipeline
List<Bson> pipeline = buildPipeline(collections);
ChangeStreamIterable<Document> watch = db.watch(pipeline);
if (resumeToken != null) {
watch.resumeAfter(resumeToken);
}
// 设置批量拉取change stream的条数
watch.batchSize(pullBatchSize);
// 当事件为更新事件时,获取整个文档的内容
watch.fullDocument(FullDocument.UPDATE_LOOKUP);
try (MongoCursor<ChangeStreamDocument<Document>> iterator = watch.iterator()) {
ChangeStreamHandler changeStreamHandler = handlerMap.get(database);
ChangeStreamDocument<Document> csd;
Document document;
while (iterator.hasNext()) {
try {
csd = iterator.next();
document = new Document();
// 处理change stream 事件
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
} catch (MongoInterruptedException e) {
// 关闭任务线程时,会抛出MongoInterruptedException异常
logger.error("change stream exception:database={}", database);
logger.error(e.getMessage(), e);
} catch (SecurityException e) {
logger.error("change stream stopped. database={}", database);
} catch (Exception e) {
logger.error("change stream exception:database={}", database);
logger.error(e.getMessage(), e);
}
}
/**
* 构造pipeline,设置需要监控的集合
*/
private List<Bson> buildPipeline(Set<String> collections) {
return Lists.newArrayList(Aggregates.match(
Filters.in("ns.coll", collections)));
}
java MongoDB change stream用法示例
于 2023-01-13 09:43:00 首次发布