具体问题描述:
项目采用的spring cloud微服务架构,使用spring session(redis存储方式)达到各微服务之间session共享,即项目启动内会添加
@EnableRedisHttpSession注解。
其中有个发邮件的公共服务mail-service,有个业务模块每天执行定时任务会调用邮件服务,发送大量邮件,就会导致创建大量redisMessageListenerContailner-X线程,最终导致邮件服务内存溢出!
原因分析:
在Spring Session(redis)的配置类源码中(RedisHttpSessionConfiguration):
@Autowired(
required = false //该处理监听的线程池不是必须的,如果不自定义默认将使用SimpleAsyncTaskExecutor线程池
)
@Qualifier("springSessionRedisTaskExecutor")
public void setRedisTaskExecutor(Executor redisTaskExecutor) {
this.redisTaskExecutor = redisTaskExecutor;
}
springSessionRedisTaskExecutor不是必须的,如果不自定义则spring默认将使用SimpleAsyncTaskExecutor线程池。
题外话:
SimpleAsyncTaskExecutor:每次都将创建新的线程&