我有一个REST网络服务,想要记录任何传入和传出的XML请求。
由于它们可能很大,因此我还必须进行某种转换,因此我想在异步线程中执行该转换。

到目前为止,我只是在logger方法上使用@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;
}

最佳答案

我应该更好地定义自己的ThreadPoolTask​​Executor而不是依赖默认的简单执行程序吗?

除非需要自定义,否则请使用默认的ThreadPoolTaskExecutor

为短暂的日志记录任务配备“重用线程”执行程序是否明智?

是。

我不想考虑线程的固定池大小,容量,油门限制等。我只想告诉我的例程:“在异步线程中执行以下逻辑。”并在上面堆叠任何东西。
我必须使用哪个TaskExecutor,以及应该使用哪个配置?

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

07-24 19:06
查看更多