Java Firestore管理员“;“倾听”;在重新启动时重新启动所有文档

Java Firestore管理员“;“倾听”;在重新启动时重新启动所有文档,java,firebase,google-cloud-firestore,firebase-admin,Java,Firebase,Google Cloud Firestore,Firebase Admin,TL;DR 每次我的Fiestore管理服务器重新启动时,所有文档都会触发我的文档侦听器,即使我已经侦听并处理了文档。我该如何避免这种情况? End-TL;DR 我正在为Firestore聊天应用程序构建后端。其基本思想是,每当用户通过客户端应用程序输入聊天信息时,后端服务器都会侦听并处理新消息 我遇到的问题是,每当我重新启动我的应用服务器时,所有已经处理的聊天都会触发侦听器。因此,它将响应每个聊天,即使它以前已经响应过。我希望应用服务器只响应尚未响应的新聊天 我有一个解决方法,就是在每个聊天文

TL;DR
每次我的Fiestore管理服务器重新启动时,所有文档都会触发我的文档侦听器,即使我已经侦听并处理了文档。我该如何避免这种情况?
End-TL;DR

我正在为Firestore聊天应用程序构建后端。其基本思想是,每当用户通过客户端应用程序输入聊天信息时,后端服务器都会侦听并处理新消息

我遇到的问题是,每当我重新启动我的应用服务器时,所有已经处理的聊天都会触发侦听器。因此,它将响应每个聊天,即使它以前已经响应过。我希望应用服务器只响应尚未响应的新聊天

我有一个解决方法,就是在每个聊天文档上放一个布尔标志。当后端处理聊天文档时,它将设置标志。然后,侦听器将只回复未设置标志的聊天

这是一个合理的方法还是有更好的方法?我担心的一点是,每次我重新启动我的应用服务器时,我都会因为重新查询以前的所有聊天记录而被收取高额费用。我担心的另一个问题是,倾听似乎会限制记忆?如果我的应用程序规模很大,我是否必须将所有聊天文档存储在内存中?这似乎不能很好地扩展

    //Example listener that processes chats based on whether or not the "hasBeenRepliedTo" flag is set
    public void startFirestoreListener() {
        CollectionReference docRef = db.collection("chats");
        docRef.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots, @javax.annotation.Nullable FirestoreException e) {
            if(e != null) {
                logger.error("There was an error listening to changes in the firestore chats collection. E: "+e.getLocalizedMessage());
                e.printStackTrace();
            }
            else if(queryDocumentSnapshots != null && !queryDocumentSnapshots.isEmpty()) {
                for(ChatDocument chatDoc : queryDocumentSnapshots.toObjects(ChatDocument.class)) {
                    if(!chatDoc.getHasBeenRepliedTo() {
                        //Do some processing
                        chatDoc.setHasBeenRepliedTo(true); //Set replied to flag
                   }
                   else {
                     //No-op, we've already replied to this chat
                   }
                }
            }
        }
    });

}
//基于是否设置了“hasBeenRepliedTo”标志处理聊天的示例侦听器
public void startFirestoreListener(){
CollectionReference docRef=db.collection(“聊天”);
docRef.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@javax.annotation.Nullable QuerySnapshot queryDocumentSnapshots,@javax.annotation.Nullable FirestoreException e){
如果(e!=null){
logger.error(“侦听firestore chats集合中的更改时出错。E:+E.getLocalizedMessage());
e、 printStackTrace();
}
else if(queryDocumentSnapshots!=null&!queryDocumentSnapshots.isEmpty()){
用于(ChatDocument chatDoc:queryDocumentSnapshots.toObjects(ChatDocument.class)){
如果(!chatDoc.gethasbeento(){
//做一些处理
chatDoc.sethasbeentoredto(true);//Set已回复标志
}
否则{
//无操作,我们已回复此聊天
}
}
}
}
});
}

是的,为了避免一直获取每个文档,您必须构造一个只生成已知已处理文档的查询

不,您不负责查询文档。您只负责阅读文档,如果您的查询生成文档,则会发生这种情况

是的,您必须能够在内存中保存查询的所有结果


如果您使用接收集合中每个新文档的事件,您的问题将更容易解决。您不必担心上述任何一件事,只需担心编写一个满足您对每个新文档要求的文档,并为这些调用付费。

是的,为了避免一直获取每个文档,y您必须构造一个只生成您知道已处理的文档的查询

不,您不负责查询文档。您只负责阅读文档,如果您的查询生成文档,则会发生这种情况

是的,您必须能够在内存中保存查询的所有结果


如果您使用接收集合中每个新文档的事件,您的问题将更容易解决。您不必担心上述任何一件事,只需担心编写一个满足您对每个新文档的需求的文档,并为这些调用付费。

感谢您的快速回复!云功能是一个非常有用的工具对于我的用例来说,这是一个更好的选择。这是我将要走的路线。我感谢你回答Firebase问题的活动。这使开发体验成为一种乐趣。感谢你的快速回复!云功能对于我的用例来说是一个更好的选择。这是我将要走的路线。我感谢你回答Firebase问题的活动。这是国王的发展是一种享受。