这个问题与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
函数来实现这一目标?