基本概述
Quartz是一個完全由java編寫的開源任務調度的框架,通過觸發器設置作業定時運行規則,控製作業的運行時間
Quartz框架主要核心組件包括調度器、觸發器、作業。調度器作爲作業的總指揮,觸發器作爲作業的操作者,作業爲應用的功能模塊。其關係如下圖所示
Job爲作業的接口,爲任務調度的對象;JobDetail用來描述Job的實現類及其它相關的靜態信息;Trigger爲作業的定時管理工具,一個Trigger只能對應一個作業實例,而一個作業實例可對應多個觸發器;Scheduler爲定時任務容器,爲quartz最上層的東西,它提攜了所有觸發器和作業,使它們協調工作,每個Scheduler都存有JobDetail和Trigger的註冊,一個Scheduler中可以註冊多個JobDetail和多個Trigger。
簡單實現定時任務
先創建一個job類,job類包含具體的業務實現,再創建一個測試類,測試類中包含Trigger觸發器和scheduler調度器
public class FirstJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDetail jobDetail = context.getJobDetail();
//獲取工作的名稱
String name = jobDetail.getKey().getName();//任務名
String group = jobDetail.getKey().getGroup();//任務組
String data = jobDetail.getJobDataMap().getString("data");//任務中的數據
//業務
System.out.println("job執行,job名:"+name+"job組:"+group+"數據:"+data+new Date());
}
}
public class QuartzTest {
public static void main(String[] args) {
try{
//創建scheduler調度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//定義一個Trigger,觸發條件類
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("trigger1","group1")//定義name和group
.startNow()//一旦加入scheduler立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//每隔一秒執行一次
.repeatForever());//一直執行,直到結束時間
//可以設置結束時間,如果不設置,則一直執行
//.endAt(new GregorianCalendar(2020,4,25,12,0,0).getTime());
Trigger trigger = triggerBuilder.build();
//定義一個Jobdetail
//定義job類爲Firstjob類,業務邏輯所在
JobDetail jobDetail = JobBuilder.newJob(FirstJob.class)
.withIdentity("測試任務1","test")//定義name和group
.usingJobData("data","jobdata")//定義屬性,存儲數據
.build();
//調度器中加入任務和觸發器
scheduler.scheduleJob(jobDetail,trigger);
//啓動任務調度
scheduler.start();
//睡一會
Thread.sleep(6000);
//關閉任務調度器
scheduler.shutdown();
}catch (Exception e){
e.printStackTrace();
}
}
}
測試結果
Spring整合quartz
<!-- 1.配置Job作業 -->
<bean id="appJob01" class="com.offcn.jobs.AppJob01"></bean>
<!--2.配置JobDetailed -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="appJob01" />
<property name="targetMethod" value="printHelloWord" />
</bean>
<!--3.配置trigger觸發器 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<!-- see the example of method invoking job above -->
<property name="jobDetail" ref="jobDetail" />
<!-- 10 seconds -->
<property name="startDelay" value="10000" />
<!-- repeat every 50 seconds -->
<property name="repeatInterval" value="50000" />
</bean>
<!-- 4.配置 sheduler容器-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
加載spring的配置文件:在main方法裏面加載配置文件:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-quartz.xml");
執行main方法,調度器開始執行
實現自動創建訂單功能
使用quartz,但是不使用spring容器管理。
1、創建一個job,需要注入service類(前提需要加上一段代碼SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);)參考自添加鏈接描述
@Component
public class OrderJob implements Job {
@Autowired
private OrderService orderService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("測試數據!");
try {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
orderService.AutoCreateOrder();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
2、創建一個controller
@Controller
public class QuartzController {
private Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//無參構造器
public QuartzController() throws SchedulerException {
scheduler.start();
}
@RequestMapping("/admin/order/auto")
@ResponseBody
public String startAuto() throws SchedulerException {
addOrderJob();
return "OK";
}
@RequestMapping("/admin/order/close")
@ResponseBody
public String closeAuto() throws SchedulerException {
scheduler.pauseTrigger(TriggerKey.triggerKey("trigger1","group1"));
scheduler.deleteJob(JobKey.jobKey("autoCreateOrder","order"));
//scheduler.shutdown();
return "OK";
}
public void addOrderJob() throws SchedulerException {
//定義一個Trigger,觸發條件類
TriggerBuilder triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("trigger1","group1")//定義name和group
.startNow()//一旦加入scheduler立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(3)//每隔一秒執行一次
.repeatForever());//一直執行,直到結束時間
//可以設置結束時間,如果不設置,則一直執行
//.endAt(new GregorianCalendar(2020,4,25,12,0,0).getTime());
Trigger trigger = triggerBuilder.build();
//定義一個Jobdetail
//定義job類爲Firstjob類,業務邏輯所在
JobDetail jobDetail =JobBuilder.newJob(OrderJob.class)
.withIdentity("autoCreateOrder","order")//定義name和group
.build();
//調度器中加入任務和觸發器
scheduler.scheduleJob(jobDetail,trigger);
}
}
注意:
- 開啓與關閉自動創建訂單是通過添加/刪除job來實現的,start與shutdown並不能實現多次的開啓與關閉,只能實現一次開啓/關閉,第二次就會報出異常
- scheduler的開啓是通過無參構造器開啓的,當這個類被初始化的時候,scheduler就已經開啓了
- scheduler.pauseTrigger(TriggerKey.triggerKey(“trigger1”,“group1”));暫停觸發器
- scheduler.deleteJob(JobKey.jobKey(“autoCreateOrder”,“order”));刪除指定job