哪个TaskExecutor用于异步日志记录?
我有一个REST
web服务,并希望记录任何传入和传出XML
请求。 因为它们可能非常大,我也必须应用某种转换,所以我想在异步线程中执行它。哪个TaskExecutor用于异步日志记录?
到目前为止,我只是在记录器方法上使用了@Async
注释。这将使用默认SimpleAsyncTaskExecutor
,这“不重用任何线程”: https://docs.spring.io/spring/docs/4.3.x/spring-framework-reference/htmlsingle/#scheduling-task-executor-types
问:我应该更好地定义自己的ThreadPoolTaskExecutor
,而不是依赖于默认简单执行者?为短期记录任务建立“重用线程”执行程序是否明智?
进一步考虑:我也将有一些异步数据库行更新,也应该使用@Async
执行,并可能使用相同的执行程序。
我的主要问题是:我不想考虑线程,容量,节流限制等的固定池大小。我只想告诉我的例程:“在异步线程中执行以下逻辑。只需在它上面堆叠任何东西。
我需要使用哪个TaskExecutors
以及应该应用哪种配置?
会例如下面的执行者适合?
@Bean
public ThreadPoolTaskExecutor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(4);
return executor;
}
我应该更好地定义自己的ThreadPoolTaskExecutor类,而不是依赖于默认简单执行者?
使用默认值ThreadPoolTaskExecutor
,除非您需要自定义它。
对于短暂的日志记录任务有一个“重用线程”执行器是明智的吗?
是的。
我不想考虑固定池大小的线程,容量,节流限制等。我只想告诉我的例程:“在异步线程中执行以下逻辑。只需在它上面堆叠任何东西。
我必须使用哪个TaskExecutors,以及应该应用哪个配置?
ThreadPoolTaskExecutor是够好的。在示例代码中将池大小设置为Runtime.getRuntime().availableProcessors()
。
我应该将'corePoolSize'还是'maxPoolSize'设置为处理器数量?或两者? – membersound
maxPoolSize。如果你不想将它作为FixedThreadPool处理,请设置这两个值。 –
如果我开始例如'corePoolSize = 1':它何时会增加?如果一个过程仍在进行中?因此,如果我有4个并发日志语句,它们会直接记录在4个核心/线程上吗?或者它们会堆栈在pool1的队列中,因为只有当该池的队列已满时,poolSize才会增加? (并且afaik队列在ThreadPoolTaskExecutor中默认是无效的?) – membersound