SpringBoot定时job

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w_t_y_y/article/details/81902326

定时器可以按照设定的时间自动重复执行某一个动作。比如用户下订单,现在希望将30分钟内未付款的订单自动取消,就可以写一个定时器,让它每多长时间(如一分钟,两分钟,这个时间在保证任务能执行完的情况下肯定越小越精确)执行一次,执行的时候,遍历数据库订单表,拿当前时间减去订单创建时间,超过30分钟的删除掉。

一、SpringBoot集成定时器:

先搭建好一个springBoot工程,有启动类:


package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class JobStart {
	public static void main(String[] args) {
		SpringApplication.run(JobStart.class, args);
	}
}

定时Job:


package com.demo.job;
import java.util.Date;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

//证明这个类是一个配置文件
@Configuration
//打开quartz定时器总开关
@EnableScheduling       
public class JobDemo {
	
	@Scheduled(cron = "0/30 * * * * ?")
	public void myTest1(){
		System.out.println("job1每30秒执行一次"+new Date());
	}
	


	@Scheduled(cron = "0 0/1 * * * ? ")
	public void myTest2(){
		System.out.println("job2每一分钟执行一次"+new Date());
	}

}

之后启动JobStart类启动整个工程,可以看到控制台打印信息如下:

再如,现在有一个抢购活动,活动有三种状态:在开始时间(beginTime)前的为未开始状态,在开始时间和结束时间endTime之间的为进行中状态,在结束时间后的为结束状态。创建活动时会设定开始时间、结束时间、状态(均为未开始),现在通过一个job来自动改变活动的状态:


@Configuration
@EnableScheduling
public class ActivityTask{

@Autowired
private GroupActivityService groupActivityService;

@Scheduled(cron = "0 0/1 * * * ? ")
public void activity() {
		try {
			
			//遍历活动表,获取所有未结束的活动
			List<Activity> activityList = groupActivityService.getNotEndActivityList();		
			for(Activity activity:activityList){
				Short status = activity.getStatus();
				Date beginTime = activity.getBeginTime();
				Date endTime = activity.getEndTime();
				Date date = new Date();
				//待开始的,判断是否开始了
				if(status == (short)ActivityStatusEnum.WAIT.getCode()){
					
					//当前时间>开始时间  && 当前时间<结束时间,开始
					if(date.after(beginTime)  &&  endTime.after(date)){
						activity.setStatus((short)ActivityStatusEnum.START.getCode());
						groupActivityService.update(activity);
					}
				}
				
				
				//开始的,判断是否结束了
				if(status == (short)ActivityStatusEnum.START.getCode()){
					//当前时间>结束时间,结束
					if(date.after(endTime)){
						activity.setStatus((short)ActivityStatusEnum.END.getCode());
						groupActivityService.update(activity);
					}
				}
				
			}
		} catch (Throwable t) {
			logger.error(t.toString());
		}
		logger.debug("end job" + new Date());
	}
}

二、关于cron表达式:

在线cron表达式生成器:http://cron.qqe2.com/

注:几种定时的比较:https://blog.csdn.net/liu1pan2min3/article/details/51540470

猜你喜欢

转载自blog.csdn.net/w_t_y_y/article/details/81902326