我创建了一个应用程序,该应用程序读取mongo更改流以进行更新和插入,然后我们对更改后的数据采取措施。以下是我的代码段
private void listenChangeStream() {
Runnable changeListener = new Runnable() {
@Override
public void run() {
String fullDoc = null;
String updateInfo = null;
while (cursor.hasNext()) {
try {
ChangeStreamDocument<Document> next = cursor.next();
String id = next.getDocumentKey().getString("id").getValue();
LOGGER.debug("Change Stream recived:{}", next);
String operationType = next.getOperationType().getValue();
if ("insert".equals(operationType) || "replace".equals(operationType)) {
fullDoc = next.getFullDocument().toString();
if (fullDoc.contains("image_info")) {
kafkaProducer
.pushOfflineProcessingData(new DataPackets(Id, OfflineProcessType.IMAGE));
}
} else if ("update".equals(operationType)) {
updateInfo = next.getUpdateDescription().toString();
if (updateInfo.contains("image_info"))
kafkaProducer
.pushOfflineProcessingData(new DataPackets(Id, OfflineProcessType.IMAGE));
}
} catch (Exception ex) {
LOGGER.info("Exception has come in cahnge listener::", ex);
}
}
}
};
executor = Executors.newFixedThreadPool(1);
executor.execute(changeListener);
}
private MongoCursor<ChangeStreamDocument<Document>> getCursor(MongoCollection<Document> supplierCollection, List<Bson> pipeline) {
MongoCursor<ChangeStreamDocument<Document>> cursor;
cursor = supplierCollection.watch(pipeline).iterator();
return cursor;
}
这很好。 我面临的问题是,每当我启动服务器时,更改流就开始读取旧的已提交更改。我不想要的。我想要在部署之后仅选择新的更新。
有人建议如何做吗?
答案 0 :(得分:3)
有人建议如何做吗?
在具有MongoDB Java驱动程序v3.8的MongoDB v4.0中,可以将startAtOperationTime
参数指定为MongoClient.watch()。
更改流将仅提供在指定时间戳记之后发生的更改。在MongoDB服务器上运行的任何命令都将返回一个操作时间,该时间可用作参数的值。默认值为创建更改流之前从服务器获得的操作时间。
或者,您也可以从更改流通知中缓存最近一次查看的_id
。这是一个resumeToken
,您可以传递给resumeAfter()
方法来恢复在resumeToken
中指定的操作之后开始的通知。例如:
BsonDocument resumeToken = next.getResumeToken();
cursor = inventory.watch().resumeAfter(resumeToken).iterator();