首页 > 社交 > 科普中国

Spring

常驻编辑 科普中国 2022-05-29 切面   切入点   注解   线程   实战   源码   原理   过程   类型   方式   通知   方法
qHb拜客生活常识网

从以上截图确实是找到了,而且类型还是 ThreadPoolTaskExecutor 类型的,那可以推断出 Spring 一定是在某个地方创建了一个 ThreadPoolTaskExecutor 类型的 Bean。qHb拜客生活常识网

果然,在 spring-boot-autoconfigure 2.1.3.RELEASE 中,会在 org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration 中自动创建一个默认的 ThreadPoolTaskExecutor bean,getDefaultExecutor 方法会在容器中找到这个bean,并将其作为默认的 @Async 注解的执行线程池。qHb拜客生活常识网

这里我为什么要标注版本呢?因为某些低版本的 spring-boot-autoconfigure,是没有 TaskExecutionAutoConfiguration 的,此时 Spring 就会选择 SimpleAsyncTaskExecutor。qHb拜客生活常识网

org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfigurationqHb拜客生活常识网

qHb拜客生活常识网

从以上源码可以看出,默认的线程池的参数还可以手动在 properties 中配置,这意味着不需要主动创建线程池的情况下,也可以通过 properties 配置文件更改线程池相关参数。qHb拜客生活常识网

创建线程池 Bean 的几种方式

1、直接创建一个 Bean 的方式,这貌似是最多人使用的方式,可以创建多个线程池 Bean,使用时指定线程池 Bean 名称:qHb拜客生活常识网

@Bean("myTaskExecutor_1")
public Executor getThreadPoolTaskExecutor1() {
  final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  // set ...
  return executor;
}

@Bean("myTaskExecutor_2")
public Executor getThreadPoolTaskExecutor2() {
  final ThreadPoolExecutor executor = new ThreadPoolExecutor();
  // set ...
  return executor;
}

2、实现 AsyncConfigurer 接口方式:qHb拜客生活常识网

@Component
public class AsyncConfigurerTest implements AsyncConfigurer {

  private static final Logger LOGGER = LoggerFactory.getLogger(AsyncConfigurerTest.class);

  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    // set ...
    return executor;
  }

  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return (ex, method, params) -> {
      LOGGER.info("Exception message:{}", ex.getMessage(), ex);
      LOGGER.info("Method name:{}", method.getName());
      for (Object param : params) {
        LOGGER.info("Parameter value:{}", param);
      }
    };
  }
}

这种方式可以方便定义异常处理的逻辑,不过从源码分析可以看出,项目中只能存在一个 AsyncConfigurer 的配置,意味着我们只能通过 AsyncConfigurer 配置一个自定义的线程池 Bean。qHb拜客生活常识网

qHb拜客生活常识网

3、利用 spring-boot-autoconfigure 在 properties 配置线程池参数:qHb拜客生活常识网

前面讲到了 Spring 默认线程池策略,这里利用 spring-boot-autoconfigure 默认创建一个 ThreadPoolTaskExecutor,通过 properties 自定义线程池相关参数。qHb拜客生活常识网

这个方式的缺点就是类型固定为 ThreadPoolTaskExecutor,且只能有一个线程池。qHb拜客生活常识网

总结了很多有关于java面试的资料,希望能够帮助正在学习java的小伙伴。由于资料过多不便发表文章,创作不易,望小伙伴们能够给我一些动力继续创建更好的java类学习资料文章,qHb拜客生活常识网

请多多支持和关注小作,别忘了点赞+评论+转发。右上角私信我回复【03】即可领取免费学习资料谢谢啦!qHb拜客生活常识网

相关阅读:

  • “想了两个月,馋了两个月”…上海人最爱的切面、馄饨皮
  • 面食大全114
  • 当你走投无路的时候,千万不要放弃,这恰恰是你绝处逢生的
  • 校长带发霉面包看望学生?先别急着指责校长
  • 手撕白菜/包菜
  • 过年吃饺子,十几年都是这个馅,3样食材搭配,鲜美,全家喜爱
  • 吃了半辈子疙瘩汤,这做法真是头一次见,味道鲜美,全家爱喝
  • 冬天发面时,记住别直接和面,把经验都告诉你,发面就是这么
  • 面包机可以代替厨师机揉面么?哪个揉面更好?
  • 今年夏天最爱的心机身体乳,涂完全身马上白2个度
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。