Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MongoDB更改流读取旧更新的数据_Java_Mongodb_Nosql_Mongodb Query_Changestream - Fatal编程技术网

Java MongoDB更改流读取旧更新的数据

Java MongoDB更改流读取旧更新的数据,java,mongodb,nosql,mongodb-query,changestream,Java,Mongodb,Nosql,Mongodb Query,Changestream,我创建了一个应用程序,它读取mongo change stream以进行更新和插入,然后对更改的数据采取操作。下面是我的代码片段 private void listenChangeStream() { Runnable changeListener = new Runnable() { @Override public void run() { String fullDoc = null;

我创建了一个应用程序,它读取mongo change stream以进行更新和插入,然后对更改的数据采取操作。下面是我的代码片段

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;
    }
private void listenChangeStream(){
Runnable changeListener=新的Runnable(){
@凌驾
公开募捐{
字符串fullDoc=null;
字符串updateInfo=null;
while(cursor.hasNext()){
试一试{
ChangeStreamDocument next=cursor.next();
字符串id=next.getDocumentKey().getString(“id”).getValue();
debug(“接收到的更改流:{}”,下一步);
String operationType=next.getOperationType().getValue();
如果(“插入”.equals(操作类型)| |“替换”.equals(操作类型)){
fullDoc=next.getFullDocument().toString();
if(fullDoc.contains(“图像信息”)){
卡夫卡制作人
.pushOfflineProcessingData(新数据包(Id,OfflineProcessType.IMAGE));
}
}else if(“update”.equals(operationType)){
updateInfo=next.getUpdateDescription().toString();
if(updateInfo.contains(“图像信息”))
卡夫卡制作人
.pushOfflineProcessingData(新数据包(Id,OfflineProcessType.IMAGE));
} 
}捕获(例外情况除外){
info(“cahnge侦听器中出现异常::”,ex);
}
}
}
};
executor=Executors.newFixedThreadPool(1);
executor.execute(changeListener);
}
专用MongoCursor getCursor(MongoCollection supplierCollection,列表管道){
MongoCursor光标;
cursor=supplierCollection.watch(pipeline.iterator();
返回光标;
}
这很好用。 我面临的问题是,每当我启动服务器时,更改流就会开始读取旧的提交的更改。这是我不想要的。我想在部署后,只有新的更新应该由这个选择

有人能建议怎么做吗

有人能建议怎么做吗

在使用MongoDB Java驱动程序v3.8的MongoDB v4.0中,您可以将
startOperationTime
参数指定为

变更流将只提供在指定时间戳之后发生的变更。对MongoDB服务器运行的任何命令都将返回一个操作时间,该时间可以用作参数值。默认值是在创建更改流之前从服务器获得的操作时间

或者,您也可以缓存更改流通知中最后看到的
\u id
。这是一个
resumeToken
,您可以将其传递到
resumeAfter()
方法,以恢复在
resumeToken
中指定的操作之后开始的通知。例如:

BsonDocument resumeToken = next.getResumeToken();
cursor = inventory.watch().resumeAfter(resumeToken).iterator();
另见

有人能建议怎么做吗

在使用MongoDB Java驱动程序v3.8的MongoDB v4.0中,您可以将
startOperationTime
参数指定为

变更流将只提供在指定时间戳之后发生的变更。对MongoDB服务器运行的任何命令都将返回一个操作时间,该时间可以用作参数值。默认值是在创建更改流之前从服务器获得的操作时间

或者,您也可以缓存更改流通知中最后看到的
\u id
。这是一个
resumeToken
,您可以将其传递到
resumeAfter()
方法,以恢复在
resumeToken
中指定的操作之后开始的通知。例如:

BsonDocument resumeToken = next.getResumeToken();
cursor = inventory.watch().resumeAfter(resumeToken).iterator();
另见