Springboot:编写定时任务的2种方式

1.使用@Scheduled注解实现

@AllArgsConstructor
@Slf4j
@Component
public class ScheduledTasks {

	//此处可以注入其他服务

    /**
     "0/5 * *  * * ?"   每5秒触发
	 "0 0/2 * * * ?"    每2分钟执行一次
     "0 0 12 * * ?"    每天中午十二点触发
     "0 15 10 ? * *"    每天早上10:15触发
     "0 15 10 * * ?"    每天早上10:15触发
     "0 15 10 * * ? *"    每天早上10:15触发
     "0 15 10 * * ? 2005"    2005年的每天早上10:15触发
     "0 * 14 * * ?"    每天从下午2点开始到2点59分每分钟一次触发
     "0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发
     "0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
     "0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发
     "0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发
     "0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发
     */
    @Scheduled(cron="0 55 23 ? * *")   //每天晚上23点55分触发执行一次
    public void startTask(){
		log.info("任务在执行...");
	}

2.利用线程池ScheduledExecutorService

@Component
@Slf4j
@Order(1)
public class SoftGatewayHeartbeat implements ApplicationRunner {

	//此处可以注入其他服务
	
	@Override
	public void run(ApplicationArguments args) throws Exception {
		ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

		executorService.scheduleAtFixedRate(new Runnable() {
			@Override
			public void run() {
				log.info("任务在执行...");
			}
		},2,cycle, TimeUnit.SECONDS);
	}
}

利用线程池做定时任务有个问题,就是任务启动时机的问题,案例采用了线程池跟随系统一起启动,类实现了ApplicationRunner接口的run方法,注解的@Order(1)主要用来对多个随系统一起启动的任务进行排序。

一般这种适用于设计一些心跳场景的设计和实现,如虚拟设备上线后,给服务器或主机上报心跳信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行云的逆袭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值