Этот вопрос относится к Немедленно вернитесь в весенний веб-поток , но я не думаю, что это то же самое (по крайней мере, ответ там меня не устраивает).
У меня есть функция, возвращающая Mono
, которая при вызове запускает длительное задание. Эта функция вызывается при вызове HTTP-API Spring Webflux. Вот пример:
@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
для достижения этой цели?