gpt4 book ai didi

java - 重启后再次将 Firestore admin "listens"发送到所有文档

转载 作者:行者123 更新时间:2023-12-02 02:14:49 24 4
gpt4 key购买 nike

TL;DR
每次我的 Fiestore 管理服务器重新启动时,即使我已经监听并处理了该文档,所有文档的文档监听器都会被触发。我该如何解决这个问题?
结束 TL;DR

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

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

我的一个解决方法是在每个聊天文档上放置一个 boolean 标志。当后端处理聊天文档时,它会设置该标志。然后,监听器将仅回复未设置标志的聊天。

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

    //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
}
}
}
}
});

}

最佳答案

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

不,您无需支付查询文档的费用。您只需阅读它们,如果您的查询生成文档,就会发生这种情况。

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

如果您使用Cloud Functions,您的问题会更容易解决。接收集合中每个新文档的事件。您不必担心上述任何事情,只需担心编写 Firestore trigger它可以对每个新文档执行您想要的操作,并为这些调用付费。

关于java - 重启后再次将 Firestore admin "listens"发送到所有文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com