Skip to content

Spring Webflux 5.2.0.M2 - Kotlin coroutines - ServerRequest.awaitPrincipal always null #22986

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
FrontierPsychiatrist opened this issue May 17, 2019 · 7 comments
Assignees
Labels
in: web Issues in web modules (web, webmvc, webflux, websocket) type: bug A general bug
Milestone

Comments

@FrontierPsychiatrist
Copy link

FrontierPsychiatrist commented May 17, 2019

When using a suspend HandlerFunction req.awaitPrincipal() always returns null for me.

I created a new application with Spring Boot 2.2.0.M3 and the spring-webflux and spring-security starters. It has one coroutine based handler function and a "classic" one, both using the principal. The coroutine always gets null when calling req.awaitPrincipal(), but req.principal() works in the "classic" handler.

package com.example

import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Bean
import org.springframework.web.reactive.function.server.*
import reactor.core.publisher.Mono

suspend fun coroutineHandler(req: ServerRequest): ServerResponse {
    val principal = req.awaitPrincipal()
    return ServerResponse.ok().bodyAndAwait(principal!!)
}

fun classicHandler(req: ServerRequest): Mono<ServerResponse> =
        req.principal()
                .flatMap { ServerResponse.ok().syncBody(it) }

@SpringBootApplication
open class Application {

    @Bean
    open fun router(): RouterFunction<ServerResponse> {
        val co = coRouter {
            GET("/co", ::coroutineHandler)
        }
        val classic = router {
            GET("/classic", ::classicHandler)
        }
        return co.and(classic)
    }

}

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}

Using curl:

curl localhost:8080/classic --user user:test
# Returns Principal
curl localhost:8080/co --user user:test
# NPE, 500 status code

Is there some misunderstanding on my side or is this a bug?

Full example application is attached: principal-coroutine-null.zip

For completeness, here is the stacktrace:

2019-05-17 09:03:10.599 ERROR 23470 --- [     parallel-3] a.w.r.e.AbstractErrorWebExceptionHandler : [d8098331] 500 Server Error for HTTP GET "/co"

kotlin.KotlinNullPointerException: null
	at com.example.AppKt.coroutineHandler(App.kt:11) ~[main/:na]
	at com.example.Application$router$co$1$1.invoke(App.kt:24) ~[main/:na]
	at com.example.Application$router$co$1$1.invoke(App.kt:19) ~[main/:na]
	at org.springframework.web.reactive.function.server.CoRouterFunctionDsl$asHandlerFunction$1$1.invokeSuspend(CoRouterFunctionDsl.kt:440) ~[spring-webflux-5.2.0.M2.jar:5.2.0.M2]
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) ~[kotlin-stdlib-1.3.31.jar:1.3.31-release-198 (1.3.31)]
	at kotlinx.coroutines.DispatchedKt.resumeCancellable(Dispatched.kt:447) ~[kotlinx-coroutines-core-1.2.1.jar:na]
	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:25) ~[kotlinx-coroutines-core-1.2.1.jar:na]
	at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:109) ~[kotlinx-coroutines-core-1.2.1.jar:na]
	at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:154) ~[kotlinx-coroutines-core-1.2.1.jar:na]
	at kotlinx.coroutines.reactor.MonoKt$mono$1.accept(Mono.kt:38) ~[kotlinx-coroutines-reactor-1.2.1.jar:na]
	at kotlinx.coroutines.reactor.MonoKt$mono$1.accept(Mono.kt) ~[kotlinx-coroutines-reactor-1.2.1.jar:na]
	at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:57) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:275) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:849) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2126) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1934) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1808) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:442) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:212) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:141) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onNext(FluxFilter.java:107) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:92) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:275) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:849) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1570) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:92) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:113) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:331) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1570) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:144) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:113) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2126) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.request(FluxFilterFuseable.java:185) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:103) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onSubscribe(FluxFilterFuseable.java:82) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoCurrentContext.subscribe(MonoCurrentContext.java:35) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:47) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:56) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:47) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefaultIfEmpty.subscribe(MonoDefaultIfEmpty.java:37) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:113) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2126) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.request(FluxFilterFuseable.java:185) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:103) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onSubscribe(FluxFilterFuseable.java:82) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:47) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:442) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:212) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefaultIfEmpty.subscribe(MonoDefaultIfEmpty.java:37) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:78) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2128) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1934) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1808) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.checkTerminated(FluxFlatMap.java:794) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:560) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:540) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onComplete(FluxFlatMap.java:426) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:265) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:201) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:335) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter.subscribe(FluxFilter.java:53) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1570) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onComplete(FluxDefaultIfEmpty.java:100) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onComplete(FluxMap.java:262) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1571) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoProcessor.onNext(MonoProcessor.java:316) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:192) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1570) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSupplier.subscribe(MonoSupplier.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:360) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onComplete(FluxConcatMap.java:269) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators.complete(Operators.java:132) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:122) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoProcessor.add(MonoProcessor.java:456) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoProcessor.subscribe(MonoProcessor.java:369) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefaultIfEmpty.subscribe(MonoDefaultIfEmpty.java:37) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:78) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2128) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1934) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1808) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.checkTerminated(FluxFlatMap.java:794) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:560) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:540) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onComplete(FluxFlatMap.java:426) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:265) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:201) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:335) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter.subscribe(FluxFilter.java:53) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:78) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2128) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1934) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1808) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.checkTerminated(FluxFlatMap.java:794) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:560) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:540) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onComplete(FluxFlatMap.java:426) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:265) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:201) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:335) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter.subscribe(FluxFilter.java:53) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:174) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:78) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2128) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1934) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1808) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Mono.subscribe(Mono.java:3711) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.checkTerminated(FluxFlatMap.java:794) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:560) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:540) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onComplete(FluxFlatMap.java:426) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:265) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:201) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:335) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter.subscribe(FluxFilter.java:53) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoOnAssembly.subscribe(MonoOnAssembly.java:61) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:153) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoSubscriberContext.subscribe(MonoSubscriberContext.java:47) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:204) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1570) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:144) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxFilter$FilterSubscriber.onNext(FluxFilter.java:107) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.publisher.FluxSubscribeOnValue$ScheduledScalar.run(FluxSubscribeOnValue.java:178) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:50) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at reactor.core.scheduler.SchedulerTask.call(SchedulerTask.java:27) ~[reactor-core-3.3.0.M1.jar:3.3.0.M1]
	at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) ~[na:1.8.0_212]
	at java.util.concurrent.FutureTask.run(FutureTask.java) ~[na:1.8.0_212]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_212]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[na:1.8.0_212]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_212]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_212]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_212]
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	|_ checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.ui.LogoutPageGeneratingWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.ui.LoginPageGeneratingWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.csrf.CsrfWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
	|_ checkpoint ⇢ org.springframework.boot.web.reactive.filter.OrderedHiddenHttpMethodFilter [DefaultWebFilterChain]
	|_ checkpoint ⇢ HTTP GET "/co" [ExceptionHandlingWebHandler]

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged or decided on label May 17, 2019
@FrontierPsychiatrist
Copy link
Author

I forgot to mention (and it's missing in the example application), in tests with Spring Security's @WithMockUser the coroutine handler works weirdly enough.

@FrontierPsychiatrist
Copy link
Author

After a bit more of research this seems to boil down to the GlobalScope.mono coroutine creator that is used in the CoRouterFunctionDsl. The subscriberContext seems to not end up in suspended functions.
I also opened Kotlin/kotlinx.coroutines#1212 to investigate this.

@sdeleuze sdeleuze self-assigned this May 28, 2019
@sdeleuze
Copy link
Contributor

As discussed on Kotlin side, this depends on Kotlin/kotlinx.coroutines#284.

@sdeleuze sdeleuze added in: web Issues in web modules (web, webmvc, webflux, websocket) type: bug A general bug and removed status: waiting-for-triage An issue we've not yet triaged or decided on labels May 28, 2019
@sdeleuze sdeleuze added this to the 5.2 M3 milestone May 28, 2019
@sdeleuze sdeleuze modified the milestones: 5.2 M3, 5.2 RC1 Jun 7, 2019
@sdeleuze
Copy link
Contributor

Moving this one to RC2 since Reactor - Coroutines context is not complete yet, see Kotlin/kotlinx.coroutines#284 (comment) for more details.

@sdeleuze sdeleuze modified the milestones: 5.2 RC1, 5.2 RC2 Jul 21, 2019
@sdeleuze
Copy link
Contributor

This issue is supposed to be fixed by Coroutines 1.3.0-RC2, to be verified asap Spring Boot has switch on Spring Framework 5.2 snapshot.

@sdeleuze
Copy link
Contributor

I confirm it now works as expected.

@FrontierPsychiatrist
Copy link
Author

I tested this with Spring Boot 2.2.0.M6 in my project and can also confirm it works now! Thanks a lot!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
in: web Issues in web modules (web, webmvc, webflux, websocket) type: bug A general bug
Projects
None yet
Development

No branches or pull requests

3 participants