即使客户端断开连接,Grpc Server 也会继续处理数据

2023-12-04

我有一个服务器,它为给定的请求传输数据,下面是执行该功能的方法

@Override
public void getChangeFeed(ChangeFeedRequest request, StreamObserver<ChangeFeedResponse> responseObserver) {
    long queryDate = request.getFromDate();
    long offset = request.getPageNo();
    ChangeFeedResponse changeFeedResponse =  processData(responseObserver, queryDate, offset);

    while(true){
        if(changeFeedResponse!=null && !changeFeedResponse.getFinalize()){
            responseObserver.onNext(changeFeedResponse);
           changeFeedResponse = processData(responseObserver, changeFeedResponse.getToDate(), changeFeedResponse.getPageNo());
        }else{
            break;
        }
    }
    responseObserver.onNext(changeFeedResponse);
    responseObserver.onCompleted();
}

当客户端断开连接时,服务器仍然继续处理,当多个客户端正在获取数据时,这可能会出现问题。需要知道如何告诉服务器停止处理


有两种相当等效的方法。一种是使用 Context,当 RPC 完成/取消时,Context 也被取消:

while(!Context.current().isCancelled()){ // THIS LINE CHANGED
    if(changeFeedResponse!=null && !changeFeedResponse.getFinalize()){
        responseObserver.onNext(changeFeedResponse);
       changeFeedResponse = processData(responseObserver, changeFeedResponse.getToDate(), changeFeedResponse.getPageNo());
    }else{
        break;
    }
}

另一种是使用 ServerCallStreamObserver:

// THE NEXT TWO LINES CHANGED
ServerCallStreamObserver scso = (ServerCallStreamObserver) responseObserver;
while(!scso.isCancelled()){
    if(changeFeedResponse!=null && !changeFeedResponse.getFinalize()){
        responseObserver.onNext(changeFeedResponse);
       changeFeedResponse = processData(responseObserver, changeFeedResponse.getToDate(), changeFeedResponse.getPageNo());
    }else{
        break;
    }
}

这两种方法都可以在发生取消时提供通知,但在您的情况下轮询是最简单的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使客户端断开连接,Grpc Server 也会继续处理数据 的相关文章

随机推荐

  • 有没有办法控制宏扩展顺序

    我希望有人知道如何控制 指定宏扩展的顺序 这是上下文 32 bit increments processor has registers for set clear and invert define CLR OFF 1 define SE
  • 如何让python成功从互联网上下载大图片

    所以我一直在使用 urllib request urlretrieve URL FILENAME 下载互联网上的图像 它效果很好 但在某些图像上失败 它失败的似乎是较大的图像 例如 https i stack imgur com jQkbJ
  • 在 JPanel 之间切换

    我正在尝试制作一款游戏 游戏中有几个不同的屏幕 例如主菜单和实际的游戏屏幕 其中每一个都是一个单独的 jpanel 扩展 我已将它们中的每一个添加到我的 JFrame 中 这是一个名为 Game 的类 在我的游戏类中 我有以下方法 publ
  • 无法使用 FQL 获取 Facebook 群组中的所有用户

    我正在尝试使用以下 FQL 查询获取 Facebook 群组中每个用户的姓名 从 uid 所在的用户中选择名字 姓氏 从以下位置选择 uid group member 其中 gid 123 然而 该小组的 7000 名成员中 这只得到了大约
  • 如何计算 SQL Server 列中某个值连续出现的次数

    我有一张桌子Attendance在我的数据库中 Date Present 20 11 2013 Y 21 11 2013 Y 22 11 2013 N 23 11 2013 Y 24 11 2013 Y 25 11 2013 Y 26 11
  • 并行化 Numpy 向量运算

    让我们使用 例如 numpy sin 以下代码将返回数组中每个值的正弦值a import numpy a numpy arange 1000000 result numpy sin a 但我的机器有 32 个核心 所以我想利用它们 对于类似
  • 在鼠标下滚动窗口

    如果您查看一下 Visual Studio 2012 您会注意到 如果您使用鼠标滚轮 则鼠标下方的窗口将滚动 而不是焦点窗口 也就是说 如果将光标放在代码编辑器中 并将鼠标移到解决方案资源管理器窗口上并滚动 则解决方案资源管理器将滚动 而不
  • 为什么 python 中会缓存字符串对象

    这是示例 gt gt gt first string str This is some how cached gt gt gt second string str This is some how cached gt gt gt id fi
  • 在 Windows/Linux 上使用 python3 脚本检查可执行文件是 32 位还是 64 位

    我正在用 Python3 编写软件 更具体地说 Python 3 8 1 在某些时候 软件需要检查某个任意可执行文件是 64 位还是 32 位 经过一番研究 我发现了以下帖子 检查 exe 是 32 位还是 64 位 在这篇文章中 提供了以
  • 将 CPanel 中的所有 Google JDBC 服务 IP 地址列入白名单

    我正在尝试通过 JDBC 服务将 Google Docs 扩展连接到 MySQL 数据库 MySQL 数据库运行在需要使用 CPanel 的共享服务器上 CPanel 一次只能添加一个白名单规则 并且只能使用 通配符 与 0 个或多个任何类
  • EditorTemplate 中的 DropDownListFor 未选择值

    我有一个自定义对象的编辑器模板 在该编辑器模板中 我使用了几个 DropDownListFor 帮助程序 在每个模型中 我指定一个唯一的模型属性 带有预先选择的值 和包含所有选择选项的选择列表 Example 我知道正在填充选项值 从查看源
  • 如何防止jsoup转换特殊字符? [复制]

    这个问题在这里已经有答案了 请看下面的简化示例 public static void main String args String html n n n div n p 2 lt X p n div n n
  • Symfony2/Doctrine 2 - 转义密码中的特殊字符

    如何通过 Doctrine 转义用于数据库连接的密码 我的密码中有一个 Symfony2 会给我这个错误 SQLSTATE 28000 1045 Access denied for user user server using passwo
  • R 中向量的最大长度

    根据 R Memory limits 文档 不可能分配长度超过 2 31 1 的向量 这是因为用作索引的整数只能使用 31 位 符号位为 1 位 但在 64 位系统上 我应该能够分配更长的向量 为什么 R 在 64 位系统上施加相同的最大长
  • 如何在Java中将毫秒转换为“X分钟,x秒”?

    我想用记录时间System currentTimeMillis 当用户在我的程序中开始某些操作时 当他完成时 我将减去当前的System currentTimeMillis 来自start变量 我想使用人类可读的格式向他们显示经过的时间 例
  • AngularJS 发出模拟 httpGET 请求的问题

    所以我对 angularjs 及其模拟库很陌生 我正在尝试测试是否发出了特定的 GET 请求 但我总是在第二个断言中收到此错误 并且无法弄清楚原因 Error Unsatisfied requests GET 1 json 我下面的代码有什
  • 如何根据名称检测成员变量是否存在及其类型?

    我知道如何编写一个类 该类可以在编译时检测给定的类 T 是否具有具有给定名称和给定类型 Type 的成员 例如 include
  • 使用 MatMenuTrigger 上的 ViewChild 以编程方式打开 Angular 材质菜单

    如何使用按钮触发器上的模板引用变量以编程方式打开 Angular Material 菜单 使用 ViewChild 在组件中访问该变量 单击时菜单通常会打开 但我想在鼠标悬停时以编程方式打开它 鼠标悬停 事件处理程序给出错误 无法读取未定义
  • C# - 从任何字符串中查找 unicode 代码点的代理对的正则表达式?

    我正在尝试解析其中可能包含表情符号的消息 可以接收的示例消息如下所示 type chat msg UserName u00a0 ud83d ude0b n 应该匹配的是 u00a0 作为单个字符 ud83d ude0b 作为一对 我有正则表
  • 即使客户端断开连接,Grpc Server 也会继续处理数据

    我有一个服务器 它为给定的请求传输数据 下面是执行该功能的方法 Override public void getChangeFeed ChangeFeedRequest request StreamObserver