Spring boot配置自动任务改变数据状态
因为项目需要,需要设置自动任务来监测数据库工单信息,然后改变其状态;
- 若当前时间在周期结束时间之前,则不改变
- 若当前时间在周期结束时间之后,则修改状态,变为“超期未执行”
以下是配置步骤(有参考别的文章):
- .在启动类中加入开启定时任务的注解(@EnableScheduling):
@MapperScan("com.verymro.eam.dao")
@SpringBootApplication(scanBasePackages = {"com.verymro.eam.controller","com.verymro.eam.service","com.verymro.eam.flow"})
@EnableScheduling
@EnableSwagger2
public class EamWebApplication{
public static void main(String[] args) {
SpringApplication.run(EamWebApplication.class, args);
}
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setDialectType("mysql");
return paginationInterceptor;
}
}
2.相应Service中的方法要注释(@Scheduled):
/**
* 定时(间隔一分钟)任务(超期未执行)
* @param
* @return
*/
@Override
@Scheduled(fixedDelay = 60000)
public void updateState() throws ParseException {
//当前时间
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = sdf.format(date.getTime());
Date a=sdf.parse(time);
System.out.println("now>>>"+a);
PreMain p = new PreMain();
p.setState("1");
List<PreMain> preMains = preMainMapper.selectPreList(p);
for (PreMain pp:preMains) {
//周期结束时间
Calendar instance = Calendar.getInstance();
instance.setTime(sdf.parse(pp.getCycleEndTime()));
String time1=sdf.format(instance.getTime());
Date b=sdf.parse(time1);
if(b.before(a)) {
pp.setState("3");
preMainMapper.updatePre(pp);
System.out.println(pp.getWorkOrderCode()+":超期未执行!");
}
}
}
补充:
1)首先使用一个@Scheduled注解开启定时任务;
2)fixedRate表示任务执行之间的时间间隔,具体指两次任务的开始时间间隔,有可能出现第二次任务开始而第一次任务并未结束的情况;
3)fixedDelay表示任务执行之间的时间间隔,具体指本次任务结束到下次任务开始之间的时间间隔;
4)initialDelay表示首次任务启动的延迟时间;
5)所有时间的单位都是毫秒。
上面这是一个基本用法,除了这几个基本属性外,@Scheduled注解也支持cron表达式,可以非常丰富的描述定时任务的时间,cron表达式格式详情以及其他自动任务配置方法在以下链接:
SpringBoot中定时任务的实现