gpt4 book ai didi

java - 在 Firestore Java 管理 SDK 中未收到有关网络断开和重新连接的文档更新

转载 作者:行者123 更新时间:2023-11-30 05:55:05 25 4
gpt4 key购买 nike

我正在使用 Java admin SDK 在本地 PC 的 Firestore 中设置查询的监视。如果网络断开并重新连接,则我的本地计算机将不再接收更新。我观察到,如果网络重新连接发生在很短的时间间隔(< 2 - 3 分钟)内,那么就没有问题。但如果时间更长,就会出现这个问题。此外,监听器回调中不会通知任何错误/异常,以便我可以再次设置更新的监视。我的电脑没有代理,因此不可能是代理问题。

请帮助我调试此问题。

编辑:

看起来这是 SDK 中的一个错误。我启用了SDK日志并尝试了以下实验:

  • 场景 1:

    1. 关注查询更新
    2. 客户端与服务器建立 GRPC 连接。
    3. 看起来服务器每分钟都会向客户端发送一个保持 Activity 状态(?),但没有从客户端到服务器发送保持 Activity 状态
    4. 断开网络
    5. 在一分钟内重新连接,查询连接仍处于 Activity 状态,文档更新按预期到达
    6. 断开网络
    7. 5 分钟后重新连接
    8. 这里我的猜测是服务器会从其一端重置 GRPC 连接,因为它无法到达客户端,但 SDK 不知道这一点。它仍然期待服务器发送保持 Activity 状态。
    9. 客户端未收到任何文档更新(如预期)
    10. 发出新查询并观察其更新。
    11. SDK 尝试通过之前建立的同一 GRPC 连接发送查询,意识到该连接已关闭,然后打开一个新的 GRPC 连接。现在,两个查询的文档更新都开始出现。
  • 场景 2:

    1. 关注查询更新
    2. 断开网络约 5 分钟
    3. 在网络重新连接之前发出新查询。
    4. SDK 尝试通过之前建立的同一 GRPC 连接发送查询,意识到该连接已关闭,然后打开一个新的 GRPC 连接。即使这会失败,但每分钟都会重试连接尝试。
    5. 重新连接网络。
    6. SDK 的连接尝试成功,并且两个查询都开始更新。

最佳答案

必须启用 GRPC keepalive,客户端才能将 keepalive 发送到服务器并检测从服务器端关闭的任何连接。这可以通过在初始化 FirebaseApp 时在 FirestoreOptions 中提供 TransportChannelProvider 来完成。代码片段如下:

InstantiatingGrpcChannelProvider channelProvider =
InstantiatingGrpcChannelProvider.newBuilder()
.setKeepAliveTime(Duration.ofSeconds(60L))
.setKeepAliveTimeout(Duration.ofMinutes(5L))
.build();

FirestoreOptions firestoreOptions = FirestoreOptions.newBuilder()
.setChannelProvider(channelProvider).build();

FirebaseOptions options = new FirebaseOptions.Builder()
.setCredentials(credentials).setFirestoreOptions(firestoreOptions)
.setConnectTimeout(5000).setReadTimeout(5000).build();
FirebaseApp firebaseApp = FirebaseApp.initializeApp(options);

Firestore firestore = FirestoreClient.getFirestore(firebaseApp);

关于java - 在 Firestore Java 管理 SDK 中未收到有关网络断开和重新连接的文档更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53313824/

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