注解方式
@Component
public class TestQuartz {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 6000)
private void process(){
TestService test = ApplicationContextRegister.getBean(TestService.class);
System.out.println("现在时间:" + dateFormat.format(new Date()));
}
}
@Scheduled两种定时的设置:
一种是使用CronExpression表达式
一种是Rate/Delay表达式(毫秒值):
@Scheduled(fixedRate = 6000):上一次开始执行时间点后每隔6秒执行一次。
@Scheduled(fixedDelay = 6000):上一次执行完毕时间点之后6秒再执行。
@Scheduled(initialDelay=1000, fixedRate=6000):第一次延迟1秒后执行,之后按fixedRate的规则每6秒执行一次
主程序入口@EnableScheduling 开启定时任务
定时方法上@Scheduled设置定时
cron属性 按cron规则执行
fixedRate属性 以固定速率执行
fixedDelay属性 上次执行完毕后延迟再执行
initialDelay属性 第一次延时执行,第一次执行完毕后延迟后再次执行
实现SchedulingConfigurer接口
@Configuration
@EnableScheduling
public class DynamicScheduleTask implements SchedulingConfigurer {
@Mapper
public interface CronMapper {
@Select("select cron from cron limit 1")
public String getCron();
}
@Autowired
CronMapper cronMapper;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
() -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),
triggerContext -> {
String cron = cronMapper.getCron();
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}
多线程定时任务
@Component
@EnableScheduling
@EnableAsync
public class MultithreadScheduleTask {
@Async
@Scheduled(fixedDelay = 1000)
public void first() throws InterruptedException {
System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
Thread.sleep(1000 * 10);
}
@Async
@Scheduled(fixedDelay = 2000)
public void second() {
System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
System.out.println();
}
}