在使用Spring Webflux时返回响应时在后台运行Mono

问题描述 投票:0回答:1

这个问题与Return immediately in spring web flux有关,但我不认为它是相同的(至少答案对我来说不满意)。

我有一个函数返回一个Mono,当被调用时启动一个长时间运行的工作。调用Spring Webflux HTTP API时,将调用此函数。这是一个例子:

@PutMapping("/{jobId}")
fun startNewJob(@PathVariable("jobId") jobId: String,
                request: ServerHttpRequest): Mono<ResponseEntity<Unit>> {
    val longRunningJob : Mono<Job> = startNewJob(jobId)
    longRunningJob.map { job ->
        val jobUri = generateJobUri(request, job.id)
        ResponseEntity.created(jobURI).build<Unit>()
    }
}

上面代码的问题是在长时间运行的作业完成后创建“201 Created”。我想在后台启动longRunningJob并立即返回“201 Created”。

我也许可以这样做:

@PutMapping("/{jobId}")
fun startNewJob(@PathVariable("jobId") jobId: String,
                request: ServerHttpRequest): Mono<ResponseEntity<Unit>> {

    startNewJob(jobId)
        .subscribeOn(Schedulers.newSingle("thread"))
        .subscribe()

    val jobUri = generateJobUri(request, job.id)
    val response = ResponseEntity.created(jobURI).build<Unit>()
    Mono.just(response)
}

但是我不得不手动调用subscribe()(例如intellij抱怨我在非阻塞范围内调用subscribe())似乎不是很惯用。没有使用明确的subscribe,是不是有更好的方法来组成两个“流”?如果是这样,我如何修改上面的startNewJob函数来实现这一目标?

spring-boot spring-webflux project-reactor
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.