2017-10-12 91 views
2

我有一个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; 
} 

回答

1

我应该更好地定义自己的ThreadPoolTask​​Executor类,而不是依赖于默认简单执行者?

使用默认值ThreadPoolTaskExecutor,除非您需要自定义它。

对于短暂的日志记录任务有一个“重用线程”执行器是明智的吗?

是的。

我不想考虑固定池大小的线程,容量,节流限制等。我只想告诉我的例程:“在异步线程中执行以下逻辑。只需在它上面堆叠任何东西。

我必须使用哪个TaskExecutors,以及应该应用哪个配置?

ThreadPoolTaskExecutor是够好的。在示例代码中将池大小设置为Runtime.getRuntime().availableProcessors()

+0

我应该将'corePoolSize'还是'maxPoolSize'设置为处理器数量?或两者? – membersound

+0

maxPoolSize。如果你不想将它作为FixedThreadPool处理,请设置这两个值。 –

+0

如果我开始例如'corePoolSize = 1':它何时会增加?如果一个过程仍在进行中?因此,如果我有4个并发日志语句,它们会直接记录在4个核心/线程上吗?或者它们会堆栈在pool1的队列中,因为只有当该池的队列已满时,poolSize才会增加? (并且afaik队列在ThreadPoolTask​​Executor中默认是无效的?) – membersound