深入源码分析springboot lettuce的shutdown-timeout

时间:2024-05-23 17:10:13

完整路径是spring.redis.lettuce.shutdown-timeout,网上的解释是:关闭超时时间,默认值100ms。

通过追踪源码得知它的实际作用是:在关闭客户端连接之前等待任务处理完成的最长时间,在这之后,无论任务是否执行完成,都会被执行器关闭。

下面通过源码跟踪一下。

深入源码分析springboot lettuce的shutdown-timeout

通过点击配置文件的 shutdown-timeout 打开 RedisProperties类:

深入源码分析springboot lettuce的shutdown-timeout

这个类位于spring-boot-autoconfigure包下面。在同一包下面的LettuceConnectionConfiguration类,读取上面的properties,把shutdownTimeout值传给builder:

深入源码分析springboot lettuce的shutdown-timeout

可以看到builder就是LettuceClientConfiguration.LettuceClientConfigurationBuilder:

深入源码分析springboot lettuce的shutdown-timeout

LettuceClientConfiguration位于spring-data-redis包下。而同一包下的LettuceConnectionFactory类初始化入参就是LettuceClientConfiguration,而且在其中找到destroy方法,可以看到把shutdownTimeout传给了AbstractRedisClient的shutdown方法:

深入源码分析springboot lettuce的shutdown-timeout

 AbstractRedisClient位于lettuce-core包下面。通过shutdown方法上面的英文注释,我们读懂了shutdown-timeout参数的真实含义:

深入源码分析springboot lettuce的shutdown-timeout

shutdown方法的说明:关闭此客户端并在调用此方法后关闭所有打开的连接。关闭所有连接后,关联的ClientResources将正常关闭/释放,同时考虑到安静时间和关闭超时。调用shutdown后应丢弃客户端。

quietPeriod:允许执行器优雅地关闭的安静期。

timeout:在执行器关闭之前等待的最长时间。超过这一时间,不管任务在安静期是否提交,执行器都会关闭。