spring-boot 定时任务之Scheduled Task

Spring boot定时器之Scheduled Task

Scheduled task是Spring 内置的一个定时器,他可以不想Quartz那样麻烦的配置;Scheduled task有三种使用的方式,一种是在注解上直接使用task定时任务,第二种是可以进行更改定时任务的时间,第三种是可以进行手动启动定时任务和停止定时任务以及更改定时任务的时间;

第一种,spring-boot使用注解的方式实现定时任务

/**
 * spring boot时间调度器
 * @author Admin
 *
 */
@Configuration
@EnableScheduling
public class MyTask {

	/**
	 * 每一秒中执行以下改方法
	 * cron是用来指定执行的 秒,分钟,日期等
	 */
	@Scheduled(cron="0/10 * * * * *")
	public void test1(){
		System.out.println("test1");
	}
}
第二种:可以更改任务执行的时间
empty@RestController
@EnableScheduling
public class ChangeTask implements SchedulingConfigurer{
	//时间:秒,分钟,小时,日期,月份,星期,年
	private String expression="0/5 * * * * *";

	//编写更改调度时间的方法
	@RequestMapping("change")
	public String changeExpression(){
		 expression="0/10 * * * * *";
		 return "changeExpression";
	}
	
	
	@Override
	public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
		//定时任务要执行的方法	
		Runnable task=new Runnable() {
				@Override
				public void run() {
					System.out.println("changeTask"+new Date());
				}
			};
			/**
			 * 调度实现的时间控制
			 */
		Trigger trigger=new Trigger() {
			@Override
			public Date nextExecutionTime(TriggerContext triggerContext) {
				CronTrigger cronTrigger=new CronTrigger(expression);
				return cronTrigger.nextExecutionTime(triggerContext);
			}
		};
		scheduledTaskRegistrar.addTriggerTask(task, trigger);
	}

}
第三种可以手动启动或者终止定时任务获取更改定时任务执行的时间
empty/**
 * 利用线程池实现任务调度
 * Task任务调度器可以实现任务的调度和删除
 * 原理:
 * 实现一个类:ThreadPoolTaskScheduler线程池任务调度器,能够开启线程池进行任务调度
 * ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduleFuture,
 * 在这个方法中添加两个参数一个是Runable:线程接口类,和CronTrigger(定时任务触发器)
 * 在ScheduleFuture中有一个cancel可以停止定时任务
 * @author Admin
 * 
 * Scheduled Task是一种轻量级的任务定时调度器,相比于Quartz,减少了很多的配置信息,但是Scheduled Task
 * 不适用于服务器集群,引文在服务器集群下会出现任务被多次调度执行的情况,因为集群的节点之间是不会共享任务信息的
 * 每个节点的定时任务都会定时执行
 *
 */
@RestController
@EnableScheduling
public class DynamicTask {

	@Autowired
	private ThreadPoolTaskScheduler threadPoolTaskScheduler;
	
	private ScheduledFuture
     
      future;
	
	@Bean
	public ThreadPoolTaskScheduler trPoolTaskScheduler(){
		return new ThreadPoolTaskScheduler();
	} 
	/**
	 * 1,定义一个方法实现定时任务的启动
	 * 2,定义一个方法实现用于终止定时任务
	 * 3,修改定时任务时间:changeCron
	 */
	/**
	 * 启动定时器
	 * @return
	 */
	@RequestMapping("startTest")
	public String StartTest(){
		/**
		 * task:定时任务要执行的方法
		 * trigger:定时任务执行的时间
		 */
		future=threadPoolTaskScheduler.schedule(new myRunable(),new CronTrigger("0/5 * * * * *") );
		
		return "startTest";
	}
	
	/**
	 * 停止定时任务
	 * @return
	 */
	@RequestMapping("endTask")
	public String endTask(){
		if(future!=null){
			future.cancel(true);
		}
		System.out.println("endTask");
		return "endTask";
	}
	
	/**
	 * 改变调度的时间
	 * 步骤:
	 * 1,先停止定时器
	 * 2,在启动定时器
	 */
	@RequestMapping("changeTask")
	public String changeTask(){
		//停止定时器
		endTask();
		//定义新的执行时间
		future=threadPoolTaskScheduler.schedule(new myRunable(),new CronTrigger("0/10 * * * * *") );
		//启动定时器
		StartTest();
		System.out.println("changeTask");
		return "changeTask";
	}
	
	/**
	 * 定义定时任务执行的方法
	 * @author Admin
	 *
	 */
	public class myRunable implements Runnable{
		@Override
		public void run() {
			System.out.println("定时任务要执行的方法"+new Date());
		}
		
	}
	
	}

使用Scheduled Task的弊端就是不适用于分布式集群的操作,Scheduled Task是一种轻量级的任务定时调度器,相比于Quartz,减少了很多的配置信息,但是Scheduled Task不适用于服务器集群,引文在服务器集群下会出现任务被多次调度执行的情况,因为集群的节点之间是不会共享任务信息的,每个节点的定时任务都会定时执行




  • 19
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Spring Boot 中,我们可以使用 `@Scheduled` 注解来创建定时任务。该注解可以用于方法上,表示这个方法是一个定时任务。在方法上加上该注解后,Spring Boot 会自动创建一个定时任务,并按照指定的时间间隔执行该方法。 下面是一个简单的示例: ```java @Component public class MyTask { @Scheduled(fixedRate = 5000) public void run() { System.out.println("Hello, world!"); } } ``` 上面的代码中,我们定义了一个名为 `MyTask` 的类,它被标注为 `@Component`,表示这是一个组件类。该类内部还有一个名为 `run` 的方法,它被标注为 `@Scheduled(fixedRate = 5000)`,表示该方法是一个定时任务,每 5 秒钟执行一次。 除了 `fixedRate` 属性外,`@Scheduled` 注解还有其他许多属性可供配置,例如: - `fixedDelay`:表示上一次任务执行完后延迟多长时间再执行下一次任务。 - `initialDelay`:表示首次任务执行前延迟多长时间。 - `cron`:支持使用 cron 表达式来定制更复杂的执行时间规则。 下面是一个带有 `fixedDelay` 和 `initialDelay` 属性的定时任务示例: ```java @Component public class MyTask { @Scheduled(fixedDelay = 5000, initialDelay = 1000) public void run() { System.out.println("Hello, world!"); } } ``` 上面的代码中,我们将 `fixedDelay` 属性设置为 5000 毫秒,表示上一次任务执行完后延迟 5 秒钟再执行下一次任务;将 `initialDelay` 属性设置为 1000 毫秒,表示首次任务执行前延迟 1 秒钟。 最后,还要注意一点,使用 `@Scheduled` 注解创建的定时任务默认是单线程的,如果任务执行时间过长,会阻塞整个应用程序的运行。因此,在实际应用中,我们需要根据实际情况来控制任务的执行时间,或者使用线程池等机制来保证任务的并发执行。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值