Consistent handling of coroutine context #32578
Labels
in: web
Issues in web modules (web, webmvc, webflux, websocket)
status: waiting-for-triage
An issue we've not yet triaged or decided on
theme: kotlin
An issue related to Kotlin support
While refactoring the filter chain used in one of our services, which is based on
Kotlin
,Spring Boot
,WebFlux
,coRouter
&coroutines
, I've run in the following scenario:observationRegistry.asContextElement()
needs to be added early on to the context, so that the observation from http request is correctly propagatedcoRouter
, some of the filters need to be only applied to some of the routes defined in the DSLHere are the facilities I'm aware of / was able to find, which seem to be relevant for the problem at hand:
CoWebFilter
fun filter(filterFunction: suspend (ServerRequest, suspend (ServerRequest) -> ServerResponse) -> ServerResponse)
inCoRouterFunctionDsl
fun context(provider: suspend (ServerRequest) -> CoroutineContext)
inCoRouterFunctionDsl
Now, here are the problems I've run into:
CoWebFilter
s would require making them all aware of which particular EPs to wrap and which to pass onfun filter(filterFunction)
fromCoRouterFunctionDsl
allows to apply these in some parts ofcoRouter
, but thesefilter
functions aren't picking up the context thatCoWebFilter
may have left inCOROUTINE_CONTEXT_ATTRIBUTE
.fun filter(filterFunction)
will not inherit context from one another and aren't able to modify the context that the actual handler will usefun context(provider)
is used, it's executed multiple times for 1 request. I.e. it will be called to create a context for each filter, and then for the corresponding handler.In the end, I've ended up with the following "magical" implementation:
which is at least able to meet our current needs, but it still has a problem that filters added this way would only be able to modify
coroutineContext
of one another by modifyingrequest.attributes()[CoWebFilter.COROUTINE_CONTEXT_ATTRIBUTE]
explicitly.IMO, Spring Framework could:
fun context(provider)
ofcoRouter
that would be executed early on and provide the context for the first `CoWebFilter in the chainfun context(provider)
should be executed bycoRouter
during handling of a single request (e.g. it could be for example used as a fallback to provide coroutineContext once, if by the time execution goes intocoRouter
code there was noCoWebFilter
invoked).Tested on: Spring Boot 3.2.4 / Spring 6.1.5
The text was updated successfully, but these errors were encountered: