quartz定時任務以及自動創建訂單

基本概述

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章