实现定时器的方式有三种
1.TimerTask类提供的定时方法
2.Quartz定时器
3.@Scheduled注解方式
1.TimerTask类提供的定时方法
该方法可直接运行类查看效果
public static void main(String[] args) throws java.io.IOException {
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("hello");
}
};
Timer timer = new Timer();
timer.schedule(task, 0, 5000); // 0标识 5000指延迟的时间5000毫秒
}
2.Quartz定时器
#1.定义需要定时执行的方法类,实现Job接口
/**
* @ Author :Zgq
* @ Date :Created in 11:47 2019/6/6
* @ Description:定时器.创建要执行的方法
* @ Modified By:
* @Version: $
*/
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
// TODO Auto-generated method stub
//需要定时执行的方法
System.out.println("MyJob1");
}
}
#2.将我们的方法加入Spring容器,也就是写定时器,这样只能在项目运行时才能看到效果
/**
* @ Author :Zgq
* @ Date :Created in 11:49 2019/6/6
* @ Description:2.---->Quartz定时器
* @ Modified By:
* @Version: $
*/
@Configuration
public class QuartzConfig {
@Bean
public JobDetail teatQuartzDetail1(){
return JobBuilder.newJob(MyJob.class).withIdentity("testQuartz1").storeDurably().build();
}
@Bean
public Trigger testQuartzTrigger1(){
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(9) //设置时间周期单位秒
.repeatForever();
return TriggerBuilder.newTrigger().forJob(teatQuartzDetail1())
.withIdentity("testQuartz1")
.withSchedule(scheduleBuilder)
.build();
}
}
#3,主程序运行该定时器
import java.text.ParseException;
import java.util.Date;
import java.util.Timer;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import cn.test.quartz.MyJob;
import cn.test.quartz.Task;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author zgq
* @version 创建时间:2019年1月25日 上午8:55:21 解释:
*/
public class Test {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// 创建工作
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withDescription("工作的描述").withIdentity("工作的名称", "工作的组")
.build();
// 创建触发器
Trigger trigger = TriggerBuilder.newTrigger().withDescription("触发器的描述").withIdentity("触发器的名称", "触发器的组")
.withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")) // "0/5 11 * ? * *"表达式
.startAt(new Date())// 不设置,默认为当前时间
.build();
// 创建调度器,粘合工作和触发器
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
// 启动调度器
scheduler.start();
}
}
3.@Scheduled注解方式
注:使用注解时,需要在启动类上加上@EnableScheduling注解才能生效
/**
* @ Author :Zgq
* @ Date :Created in 10:43 2019/6/6
* @ Description:3.--->Scheduler定时器
* @ Modified By:
* @Version: $
*/
@Component
public class Scheduler{
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
//每隔2秒执行一次
@Scheduled(fixedRate = 5000)
public void testTasks() throws Exception{
System.out.println("定时任务执行时间:" + dateFormat.format(new Date()));
/*new MailSender()
.title("发送邮件")
.content("test")
.contentType(MailContentTypeEnum.TEXT)
.targets(new ArrayList<String>(){{
add("***@qq.com");
}})
.send();*/
}
//每天3:05执行
@Scheduled(cron = "0 05 03 ? * *")
public void testTasks2() {
System.out.println("定时任务执行时间:" + dateFormat.format(new Date()));
}
}
这里就可以定时发送邮件给某人,结合定时器的使用
发送邮件可以查看我先前写的博客
SpringBoot发送邮件整合JavaMail
cron 表达式的网上在线生成地址cron表达式