Skip to content
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

Warn about use of SimpleAsyncTaskExecutor for async requests [SPR-16203] #20751

Closed
spring-issuemaster opened this Issue Nov 15, 2017 · 8 comments

Comments

Projects
None yet
2 participants
@spring-issuemaster
Copy link
Collaborator

spring-issuemaster commented Nov 15, 2017

Rossen Stoyanchev opened SPR-16203 and commented

The Spring MVC Java config and XML namespace allow configuring an AsyncTaskExecutor originally used for java.util.concurrent.Callable return values and by default a SimpleAsyncTaskExecutor is used with the recommendation to configure a task executor with a thread pool for use under load. 

Now that the same executor is also used for blocking writes when streaming with Flux or Observable, we should warn more proactively about this in the logs. 


Affects: 5.0.1

Issue Links:

  • #20752 Support for autowire-candidate with @Bean ("depends on")
  • #20737 WebSocketConfigurationSupport.defaultSockJsTaskScheduler adds NoOpScheduler to context that is not usable in any way
  • #20943 [doc] Update documentation on WebAsyncManager thread pool

Referenced from: commits 4b861ae, 7b3a72f, 7ea8ecb

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Nov 15, 2017

Rossen Stoyanchev commented

In the mean time applications can use WebMvcConfigurer#configureAsyncSupport to customize the thread pool.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Jul 11, 2018

Rossen Stoyanchev commented

Adding 5.0.8 since this is a one-time warning in the logs.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Aug 6, 2018

Michal Domagala commented

Could you clarify whether or not WebMvcConfigurer#configureAsyncSupport is solution or workaround? I can't find any commit nor Jira ticket for more elegant configuration

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Aug 6, 2018

Rossen Stoyanchev commented

To make sure we're talking about the same thing, this is only required when streaming to the response (e.g. Server-Sent Events, or application/stream+json) via Flux or io.reactivex.Observable where each event is written to the response via a blocking write to the ServletOutputStream. If you do that, on the first such response, a warnings appears in the logs, and plugging in a thread pool via WebMvcConfigurer#configureAsyncSupport is a solution, not a workaround.

This is not needed if you return a single value, such as Mono, or a Flux that's then collected to a Mono<List> which is the case for "application/json". In those cases a warning will not appear in the logs. So the warning can be used to check whether this is needed or not.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Aug 6, 2018

Michal Domagala commented

Yes we are talking about streaming case. I would like to say that usually Spring Boot configures automatically required infrastructure, so need to configure ThreadPoolTaskExecutor from scratch is not typical.

If autoconfiguration is not possible, sample in documentation with default settings and/or good practice would be useful.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Aug 6, 2018

Rossen Stoyanchev commented

I believe something is being added to Boot for this. Stéphane Nicoll?

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Aug 6, 2018

Stéphane Nicoll commented

As of today actually and available in the next milestone of Spring Boot 2.1, see #1563 for more details. There will be a TaskExecutorBuilder that you can use to easily build custom ThreadPoolTaskExecutor instances.

In the meantime, I am afraid you'll have to implement WebMvcConfigurer.

@spring-issuemaster

This comment has been minimized.

Copy link
Collaborator Author

spring-issuemaster commented Aug 6, 2018

Michal Domagala commented

Great, big thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.