【问题标题】:Webflux Mono - Keep running to completionWebflux Mono - 继续运行直到完成
【发布时间】:2018-09-12 14:52:18
【问题描述】:

我有一个函数可以做很多事情并最终返回Mono

如果我有这样的处理程序:

fun handleSomething(request: ServerRequest): Mono<ServerResponse> {
  return longRunningMethod().flatMap {
    ServerResponse.ok.build()
  }
}

这会起作用,但在完成长时间运行的方法之前它不会返回响应。

我想做的是启动长时间运行的方法,但立即返回响应,如下所示:

fun handleSomething(request: ServerRequest): Mono<ServerResponse> {
  longRunningMethod()

  return ServerResponse.ok.build()
}

问题在于,一旦发送响应(基本上是立即),它似乎只是中止了longRunningMethod()

有没有办法让longRunningMethod() 一直运行直到它真正完成,即使请求已经完成?

【问题讨论】:

  • longRunningMethod 是做什么的?如果应用程序失败(响应状态是否仍然有效),您的应用程序应该如何表现?那个 longRunningMethod 是否以任何形式读取请求?
  • 它并没有真正从请求中读取任何内容(除了 queryParam)。在发送响应之前,任何要读出的内容都将被读取并作为参数发送到longRunningMethod()。它本质上是一个需要很长时间才能生成的报告。随后的不同请求将不得不处理检索生成的数据。在这种情况下,200 仅表示它已启动。

标签: java spring kotlin spring-webflux project-reactor


【解决方案1】:

很难确定,因为我们在这里遗漏了很多上下文。

但我认为该任务(似乎正在生成报告)与控制器没有严格联系,这可能不属于这里。相反,您可以从控制器发送应用程序事件并让事件侦听器处理它。

默认情况下,事件在当前线程中处理,因此您必须确保使用ApplicationEventMulticaster 配置Executor。最后,从 HTTP 的角度来看,是否生成报告似乎并不重要,因此您可以将它们完全解耦。

理论上,您可以执行longRunningMethod().subscribe(),但从控制器运行该副作用感觉不对,没有检查。而且它也更难测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2021-02-15
    相关资源
    最近更新 更多