如何在另一个线程上运行阻塞代码并使http请求立即返回

2024-02-10

我们开始了一个新项目Quarkus and Mutiny,并使用 Quarkus 创建了一堆端点@Funq,到目前为止一切都运行良好。现在我们想要在一个端点中处理一些非常耗时的事情,我们期望的是,一旦用户单击按钮从前端发送 http 请求并点击这个特定端点,我们将返回202 Accepted立即将耗时的操作处理留在后端的另一个线程中,然后在完成后向用户发送相应的通知电子邮件。

我知道这可以通过@Async or CompletableFuture,但现在我们想要这样做Mutiny。根据我的阅读方式Mutiny文档在这里https://smallrye.io/smallrye-mutiny/guides/imperative-to-reactive https://smallrye.io/smallrye-mutiny/guides/imperative-to-reactive, runSubscriptionOn将通过在另一个线程上运行耗时的方法来避免阻塞调用者线程,并且我的测试显示耗时的代码确实在不同的线程上执行。但是,http 请求确实not立即返回,它仍然处于挂起状态,直到耗时的方法完成执行(正如我在浏览器的开发人员工具中观察到的那样)。我是否误解了如何runSubscriptionOn作品?我如何实现这个功能Mutiny?

My @Funq端点看起来像这样

@Inject
MyService myService;

@Funq("api/report")
public Uni<String> sendReport(MyRequest request) {
    ExecutorService executor = Executors.newFixedThreadPool(10, r -> new Thread(r, "CUSTOM_THREAD"));

    return Uni.createFrom()
        .item(() -> myService.timeConsumingMethod(request))
        .runSubscriptionOn(executor);
} 

Edit:我找到了解决方案Uni基于@Ladicek 的回答。在深入研究 Quarkus 和 Uni 后,我有一个后续问题:

目前我们大部分的拦截方式是not返回统一Servicelevel,相反,我们根据它们返回的内容(即对象或列表)创建 Uni 对象,并返回 UniController像这样的端点级别

return Uni.createFrom().item(() -> myService.myIOBlockingMethod(request)).

正如@Ladicek 所解释的,我不必使用.runSubscriptionOn明确地,因为 IO 阻塞方法将自动在工作线程上运行(正如我在服务级别上的方法一样)not返回大学)。这有什么缺点吗?我的理解是,这会导致更长的响应时间,因为它必须在 I/O 线程和工作线程之间跳转,我是否正确?

对此的最佳实践是什么?我应该总是回来吗Uni对于那些阻止方法Service级别以便它们也可以在 I/O 线程上运行?如果是这样,我想我总是需要打电话.runSubscriptionOn在不同的工作线程上运行它,这样 I/O 线程就不会被阻塞,对吗?


通过返回一个Uni,你基本上是说,当Uni完成。您想要的是在线程池上运行操作并返回完整的响应(Uni或不,那并不重要)。

顺便说一句,您在该方法中为每个请求创建一个额外的线程池,并且不要将其关闭。那是错误的。您想为所有请求创建一个线程池(例如,在@PostConstruct方法),并且理想情况下也可以在应用程序结束时将其关闭(以@PreDestroy方法)。

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

如何在另一个线程上运行阻塞代码并使http请求立即返回 的相关文章

随机推荐

  • 按条件对行进行分组

    我有这个数据 Start End Quantity 425 449 24 450 474 24 475 499 24 500 524 24 2300 2324 24 2400 2499 99 2500 2599 99 2800 2899 9
  • Mongoose:将 addToSet 与 ObjectIds 一起使用会产生孤立 ID

    我在使用 mongoDB addToSet 到一个充满对象 Id 的数组时遇到了一个相当有趣的问题 在我的猫鼬模式 Happening 中 我声明了一个名为 expected 的 ObjecId 数组 供 populate 使用 expec
  • 在 .Net Core 3.1 中使用 NewtonSoft 将 DataTable 转换为 JSON 字符串时,如何获得不带“\u0022”或“\”等字符的 JSON 字符串[重复]

    这个问题在这里已经有答案了 我正在 net core 3 1 中编写一个简单的 API 要将我的 DataTable 转换为 JSON 字符串 我使用 NewtonSoft 库和以下代码 string JSONresult JsonConv
  • 保护 JavaScript Web 应用程序/游戏的方法有哪些?

    背景故事 我计划实现一款休闲游戏 部署在网络应用程序中 但我不想使用 Flash 而只是使用普通的 Javascript 我想要的 Flash 的一个好处是 它分发二进制文件而不是源代码 因此更容易保护您的代码不被其他人重用 窃取 或者防止
  • 如何用 Python 编写 Web 代理

    我正在尝试用 python 编写一个网络代理 目标是访问如下网址 http proxyurl http anothersite com 并查看内容http anothersite com就像平常一样 通过滥用 requests 库 我已经取
  • Excel 一组选项中的随机数

    在 MS Excel 中 如何随机计算一组 5 个选项中的一个数字 例如 在单元格 B1 中 我想要一个随机数 即 15 30 50 75 或 100 我想要在单元格 B1 B100 中完全随机输出这 5 个数字 我想我可以使用 rand
  • Curl 只能读取前 2000 个字节吗?

    我使用了 char URL file d temporal prueba1 txt 的curl 来测试使用硬盘驱动器文件来测试接收到的数据 我有以下问题 跳过大文件中的前 2 个字符 已解决 读取数据时出错 我只想只读一次 最好是前 200
  • 通过命令行在 Chrome 中打开网址而不使用缓存

    我使用命令chrome new window htp www example com 打开一个 url 但页面是使用上次保存在缓存中的打开的 有没有办法从命令行打开 URL 强制加载而忽略缓存 Thanks 尝试以下命令 usr bin g
  • 如何从业务/模型类发送进度更新?

    假设我们有一个具有分层架构的应用程序 在视图上我们使用 MVC 或 MVVM 模型被视为域 它有很好的业务逻辑部分 现在假设我们在模型中有一个需要一些时间的方法 例如 必须对对象的每个项目进行复杂的计算或处理 在 UI 中 我们希望显示一个
  • 在 Google Colab 上训练模型时,我应该保持连接吗?

    在 Google Colab 上训练用于对象检测的数据集模型 Darknet 时 我是否需要保持与 Colab 和互联网的连接 当训练在 Colab 上进行并连接到我的驱动器时 这里的权重文件将保存在我的谷歌驱动器文件夹中 那么 我可以断开
  • R中的参数传递机制

    下面的函数用于将一个序列相乘1 x by y f1 lt function x y return lapply 1 x function a b b a b y 好像a用于表示序列中的元素1 x 但是不知道如何理解这个参数传递机制 在其他
  • java.io.File 中 mkdir() 和 mkdirs() 之间的区别

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 谁能告诉我这两种方法之间的区别 file mkdir file mkdirs mkdirs 还创造了父目录在这个路径中File代表 jav
  • 从常规 ES6 类方法调用静态方法

    调用静态方法的标准方法是什么 我可以考虑使用constructor或者使用类本身的名称 我不喜欢后者 因为它感觉没有必要 前者是推荐的方式 还是还有其他方式 这是一个 人为的 示例 class SomeObject constructor
  • jQuery - keydown / keypress /keyup ENTERKEY 检测?

    尝试让 jQuery 检测 Enter 输入 但检测到空格和其他键 未检测到 Enter 下面有什么问题 entersomething keyup function e alert up var code e keyCode e keyCo
  • RxJS 运算符在事件流中等待安静期,但在事件流繁忙的情况下不会永远等待

    场景 我有一个事件流 每个事件都应该导致信息的更新显示 事件流来自 websockets 显示在 highcharts 图表中 但这并不重要 出于性能原因 我不想为每个事件触发 UI 更新 我宁愿做以下事情 当我收到一个事件时 我只想更新
  • 帮我用“apply”函数替换 for 循环

    如果可能的话 我的任务是找到用户连续参与游戏的最长连续天数 我没有编写 sql 函数 而是选择使用 R 的 rle 函数来获取最长的条纹 然后用结果更新我的数据库表 附加的 数据框是这样的 day user id 2008 11 01 20
  • 日语字符的正则表达式

    我正在 Struts 中进行国际化 我想为日语和英语用户编写 Javascript 验证 我知道英语的正则表达式 但不知道日语用户的正则表达式 是否可以为两个用户编写一个基于 Unicode 进行验证的正则表达式 请帮我 下面是一个正则表达
  • Prolog 中的递归 - 寻找城市之间的路径

    我正在努力完成底部的练习我发现自己对第三点完全困惑 我们获得以下旅游信息知识库 byCar auckland hamilton byCar hamilton raglan byCar valmont saarbruecken byCar v
  • 使用 Zombie.js 验证 Qunit 的结果

    我正在进行测试驱动开发Qunit http qunitjs com 当创建一个新函数时 我为它编写测试 创建函数 重新加载页面 如果所有测试都通过 我就继续 虽然一开始工作正常 但之后它开始成为一个耗时的过程一段时间 因为所有测试都需要几秒
  • 如何在另一个线程上运行阻塞代码并使http请求立即返回

    我们开始了一个新项目Quarkus and Mutiny 并使用 Quarkus 创建了一堆端点 Funq 到目前为止一切都运行良好 现在我们想要在一个端点中处理一些非常耗时的事情 我们期望的是 一旦用户单击按钮从前端发送 http 请求并