有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaWebFlux Mono一直运行到完成

我有一个函数,它做了很多事情,最终返回一个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()运行直到它实际完成,即使请求已完成


共 (1) 个答案

  1. # 1 楼答案

    很难说清楚,因为我们在这里遗漏了很多上下文

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

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

    从理论上讲,您可以执行longRunningMethod().subscribe(),但不进行检查就让控制器运行这种副作用是不对的。而且测试也会更加困难