代码之家  ›  专栏  ›  技术社区  ›  samanime

网络流量单-持续运行到完成

  •  1
  • samanime  · 技术社区  · 6 年前

    我有一个函数,它做一堆东西,最终返回一个 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 回复  |  直到 6 年前
        1
  •  0
  •   Brian Clozel    6 年前

    很难说是肯定的,因为我们遗漏了很多上下文。

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

    默认情况下,事件在当前线程中处理,因此必须确保配置 Executor 用那个 ApplicationEventMulticaster . 最后,从http的角度看,报告是否生成似乎无关紧要,因此您可以完全分离它们。

    理论上,你可以 longRunningMethod().subscribe() 但是,如果没有检查,从控制器运行的副作用是不正确的。而且也会更难测试。