为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 网络编程 > 其它综合 正文

Springboot利用@EnableScheduling执行定时任务

三叶资源网 2022-10-17 19:18:50 其它综合 242 ℃ 0 评论

在springboot中启用@EnableScheduling注解可以很方便执行定时任务。启用@EnableScheduling如下

@Configuration
@EnableScheduling
public class SchedulingConfig {  }

@Scheduled使用例子

// 每天12时定时执行
@Scheduled(cron = "0 0 12 * * *")
public void autoTask1() {
      // code ......
}

// 初始化任务执行延时initialDelay毫秒,上个任务完成后,间隔fixedDelay毫秒后继续运行
@Scheduled(initialDelay = 8000, fixedDelay = 5000)
public void autoTask2() {
     // code ......
}

@Scheduled的定义

下面具体看下@Scheduled的定义

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String CRON_DISABLED = "-";
    String cron() default "";
    String zone() default "";
    long fixedDelay() default -1L;
    String fixedDelayString() default "";
    long fixedRate() default -1L;
    String fixedRateString() default "";
    long initialDelay() default -1L;
    String initialDelayString() default "";
}

cron: 一个类似 cron 的表达式,扩展了通常的 UN*X 定义以包括在秒、分、小时、月中的某一天、月份和星期几的触发器。

fixedDelay: 上个任务完成后,间隔fixedDelay毫秒后继续运行

fixedDelayString: 类似fixedDelay

fixedRate: 在方法执行之间以固定时间(毫秒)段执行方法,该方式可能方法上次未执行完成,下次已开始执行。

initialDelay: 初次执行方法的延时时间,单位毫秒。

自定义任务执行线程池

查看@EnableScheduling相关源码,可以发现后台执行任务的线程池是1个线程,如果任务较多,执行时间有冲突,会造成任务的执行无法满足需求。

protected void scheduleTasks() {
		if (this.taskScheduler == null) {
			this.localExecutor = Executors.newSingleThreadScheduledExecutor();
			this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
		}
    ......    
}
    
    
protected ScheduledExecutorService createExecutor(
			int poolSize, ThreadFactory threadFactory, RejectedExecutionHandler rejectedExecutionHandler) {
    //poolSize=1
		return new ScheduledThreadPoolExecutor(poolSize, threadFactory, rejectedExecutionHandler);
	}

下面的代码就自定义了一个拥有10个线程的后台任务调度,需要创建一个TaskScheduler类型的对象即可。

@Bean("taskScheduler")
public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        return taskScheduler;
}

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
KeepRC4算法同步应用会员系统Js加密JS分析正态分布解析COM对象组件音乐播放器监听wifi信号强度多进程易包取已登录QQSignature过滤HTML通用型读内存获取QQ资料卡HPSocket有道翻译APP协议数据分页类
最新评论