手机网站快速建站,透明背景图片在线制作,郑州最新情况,公司英文网站多少钱文章目录 一、前言二、案例展示1、初始版本2、代码审核意见和优化建议3、潜在问题和风险4、优化建议5、优化后的代码 三、具体使用 一、前言
有时候我们在项目中做一些长链路的跑批任务时#xff0c;基于Springboot项目的定时任务#xff0c;我们可以指定一个自定义的线程配… 文章目录 一、前言二、案例展示1、初始版本2、代码审核意见和优化建议3、潜在问题和风险4、优化建议5、优化后的代码 三、具体使用 一、前言
有时候我们在项目中做一些长链路的跑批任务时基于Springboot项目的定时任务我们可以指定一个自定义的线程配置类进行单独提供给具体跑批任务使用而不占用整个系统资源。
二、案例展示
我们观察一下第一种方式和优化后的对比在哪里关键点什么
1、初始版本
Configuration
EnableAsync
public class ScheduledConfig {/*** 创建并配置一个线程池用于快速执行任务。* * return Executor 返回一个配置好的线程池实例可以用于快速执行任务。*/Bean(baseExecutor)public Executor fastExecutor() {// 创建 ThreadPoolTaskExecutor 实例ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();// 设置线程名前缀executor.setThreadNamePrefix(xxxx-schedule-baseExecutor);// 设置最大线程池大小executor.setMaxPoolSize(10);// 设置核心线程池大小executor.setCorePoolSize(8);// 设置队列容量executor.setQueueCapacity(5);// 设置拒绝执行处理器采用CallerRunsPolicy策略executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());return executor;}2、代码审核意见和优化建议
3、潜在问题和风险
异常处理 线程池的默认异常处理机制可能不足以处理所有任务抛出的异常。尽管设置了CallerRunsPolicy作为拒绝执行处理器它仅在线程池饱和时工作并不直接处理任务执行中的异常。建议增强异常处理逻辑例如通过自定义的RejectedExecutionHandler实现或者在任务代码中加入更细粒度的异常处理。资源泄露 当应用停止时如果线程池没有被正确关闭可能会导致资源泄露。虽然Spring通常会管理Bean的生命周期但最好确认ThreadPoolTaskExecutor的实例是否加入了适当的销毁逻辑例如调用executor.shutdown()。线程数配置 CorePoolSize被设置为8MaxPoolSize被设置为10这意味着在高负载情况下线程池只能扩展到10个线程。这样的配置可能不足以处理所有高峰时段的请求。你需要根据实际的负载测试结果调整这些参数。队列容量 队列容量被固定为5。这意味着一旦队列满了即使线程池还没有达到最大大小任务也会被拒绝执行。根据实际的负载情况考虑适当增加队列容量或调整线程池的大小。
4、优化建议
性能监控 考虑添加监控机制来跟踪线程池的性能指标如活跃线程数、队列大小和拒绝执行的任务数等。这有助于及时发现和调整配置参数以保证系统的稳定性。可调整性 考虑将线程池的配置参数如corePoolSize, maxPoolSize, queueCapacity等设置为可从外部配置例如应用配置文件的方式获取。这样可以在不修改代码的情况下调整这些参数以适应不同的运行环境。定制化 如果有更复杂的需求比如需要执行周期性任务或需要更细粒度的控制任务执行可以考虑使用Spring提供的其他任务调度组件如 ScheduledThreadPoolExecutor 或者集成 Quartz 等第三方库。
5、优化后的代码
Configuration
EnableAsync
public class ExecutorConfig {// 名字可以根据项目业务随意起Bean(baseExecutor)public Executor fastExecutor() {ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor();// 线程名前缀保持不变executor.setThreadNamePrefix(xxxx-schedule-base);// 调整核心线程池大小、最大线程池大小和队列容量以适应可能的更高负载executor.setCorePoolSize(16); // 增加核心线程数executor.setMaxPoolSize(20); // 增加最大线程数executor.setQueueCapacity(100); // 增加队列容量// 使用自定义的RejectedExecutionHandler来处理任务被拒绝的情况executor.setRejectedExecutionHandler(new CustomRejectedExecutionHandler());// 确保在应用停止时线程池能被正确关闭Runtime.getRuntime().addShutdownHook(new Thread(() - {executor.shutdown();}));return executor;}// 自定义的拒绝执行处理器以更好地处理任务被拒绝的情况static class CustomRejectedExecutionHandler implements RejectedExecutionHandler {Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 这里可以加入更详细的日志记录或发送警报等逻辑System.out.println(Task r.toString() rejected from executor executor.toString());}}
}
三、具体使用
Async(baseExecutor)
Scheduled(cron 0 0/5 * * * ?){
// 具体业务
}