Spring Boot目的是零配置,为了遵从该理念,下面的代码采用的是注解方式。
1、配置quartz
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
/**
* 配置quartz
* @author
*
*/
@Configuration
public class Quartz {
/**
* attention:
* Details:配置定时任务
*/
@Bean(name = "jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(Schedutask task) {// ScheduleTask为需要执行的任务
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
jobDetail.setConcurrent(false);// 是否并发执行
jobDetail.setName("overTimeNoticeJob");// 设置任务的名字
jobDetail.setGroup("overTimeNoticeJobGroup");// 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
/*
* 为需要执行的实体类对应的对象
*/
jobDetail.setTargetObject(task);
/*
* 添加需要执行的方法
* 通过这几个配置,告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的需要执行方法
*/
jobDetail.setTargetMethod("overTimeNotice");
return jobDetail;
}
/**
* attention:
* Details:配置定时任务的触发器,也就是什么时候触发执行定时任务
*/
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
tigger.setJobDetail(jobDetail.getObject());
tigger.setCronExpression("* 0/5 * * * ?");// 初始时的cron表达式 ,没5分钟执行一次
tigger.setName("overTimeNoticeTrigger");// trigger的name
return tigger;
}
/**
* attention:
* Details:定义quartz调度工厂
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) {
SchedulerFactoryBean bean = new SchedulerFactoryBean();
// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
bean.setOverwriteExistingJobs(true);
// 延时启动,应用启动1秒后
bean.setStartupDelay(1);
// 注册触发器
bean.setTriggers(cronJobTrigger);
return bean;
}
}
quartz的配置类里面配置了JobDetail的工厂、Trigger的工厂和scheduler的工厂,这样的方式可以解决Job中的spring的注入bean为空的情况。
2、工作类
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;
import com.bonc.micro.service.noticetemplate.NoticeTemplateService;
import com.bonc.server.service.EmailService;
import com.bonc.server.service.ShortMessageService;
@Configuration
@Component // 此注解必加
@EnableScheduling // 此注解必加
/**
* 超时通知任务
*
* @author liyongguan
*
*/
public class Schedutask {
//@Autowired可以使用spring的bean
/**
* 发送告警通知
*/
public void overTimeNotice() {
//实际的业务
System.out.println("OverTime start time"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
System.out.println("OverTime end time"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
知识点来自于:http://blog.csdn.net/liuchuanhong1/article/details/60873295,感谢该博主