普通web整合quartz跑定時任務

武魂95級藍銀草發表於2022-03-07

一.場景(什麼時候用到定時任務)

檔案跑批,定時處理資料,和業務解耦的場景

二.目前都有哪些工具可以定時處理資料

1.jdk的timertask:資料量小的情況下,單執行緒的

2.kettle:比較適合邏輯不復雜的資料推送

3.quartz:資料量大的情況下,分散式下的定時任務處理

三.如何整合

1.jar包下載

地址:https://www.jb51.net/softs/539791.html

 

2.理解幾個核心概念

scheduler任務排程、Job任務、Trigger觸發器、JobDetail任務細節

Job任務
其實Job是介面,其中只有一個execute方法:

package org.quartz;
public abstract interface Job
{
public abstract void execute(JobExecutionContext paramJobExecutionContext) throws JobExecutionException;
}

我們開發者只要實現此介面,實現execute方法即可。把我們想做的事情,在execute中執行即可。

JobDetail
任務細節,Quartz執行Job時,需要新建個Job例項,但是不能直接操作Job類,所以通過JobDetail來獲取Job的名稱、描述資訊。

Trigger觸發器
執行任務的規則;比如每天,每小時等。
一般情況使用SimpleTrigger,和CronTrigger,這個觸發器實現了Trigger介面。
對於複雜的時間表示式來說,比如每個月15日上午幾點幾分,使用CronTrigger
對於簡單的時間來說,比如每天執行幾次,使用SimpleTrigger

scheduler任務排程
最核心的概念,需要把JobDetail和Trigger註冊到scheduler中,才可以執行。

 四.配置示例

1.模擬新建一個工作

package tcc.test.quartz;

import com.util.RowList;
import jos.engine.core.jdbc.JdbcTemplate;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.util.Date;


/**
 * Copyright (C) @2022
 *
 * @author: tcc
 * @version: 1.0
 * @date: 2022/3/7
 * @time: 18:20
 * @description:寫業務邏輯
 */
public class TccJob implements Job {
    private static String sql = "select * from sr_main limit 100";
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("hello"+new Date());
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        RowList rowList = jdbcTemplate.queryRowList(sql);
        for(int i=0;i<rowList.size();i++){
            System.out.println(rowList.get(i).get("mhzsfz"));
        }
    }
}

2.配置一個監聽器,模擬初始化任務,處理db資料

package tcc.test.quartz;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
/**
* Application Lifecycle Listener implementation class
* ApplicationContextListener
*
*/
public class ApplicationContextListener implements ServletContextListener {
public static Scheduler scheduler = null;

/**
* Default constructor.
*/
public ApplicationContextListener() {
System.out.println("ApplicationContextListener起來了");
}

/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
//關閉Web應用時,登出定時任務
public void contextDestroyed(ServletContextEvent arg0) {
try {
scheduler.shutdown();
System.out.println("scheduler.shutdown");
} catch (SchedulerException e) {
e.printStackTrace();
}
}

/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
//開啟Web應用時,開啟定時任務
public void contextInitialized(ServletContextEvent arg0) {
try {
scheduler = StdSchedulerFactory.getDefaultScheduler();
//在這裡我編寫了三個定時任務
JobDetail updataTheStatus = JobBuilder.newJob(TccJob.class)
.withIdentity("updataTheStatus", "group1")
.build();

JobDetail updateTheRemainer = JobBuilder.newJob(TccJob.class)
.withIdentity("updateTheRemainer", "group2")
.build();

JobDetail deleteYstdayOrder = JobBuilder.newJob(TccJob.class)
.withIdentity("deleteYstdayOrder", "group3")
.build();
//三個觸發器
Trigger trigger1 = updateTheStatus();
Trigger trigger2 = updateTheRemainer();
Trigger trigger3 = deleteYstdayOrder();
//註冊
scheduler.scheduleJob(updataTheStatus, trigger1);
scheduler.scheduleJob(updateTheRemainer, trigger2);
scheduler.scheduleJob(deleteYstdayOrder, trigger3);
scheduler.start();
System.out.println("start");
} catch (SchedulerException e) {
e.printStackTrace();
}


}

//下面是定義三個觸發器的靜方法
public static Trigger updateTheStatus() {
//每天的19:18分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 18 19 * * ? "))
.startNow()
.build();
return trigger;
}

public static Trigger updateTheRemainer() {
//每天的19:18分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger2", "group2")
.withSchedule(CronScheduleBuilder.cronSchedule("0 18 19 * * ? "))
.startNow()
.build();
return trigger;
}

public static Trigger deleteYstdayOrder() {
//每天的19:18分開始執行,每天執行一次
Trigger trigger =TriggerBuilder.newTrigger()
.withIdentity("trigger3", "group3")
.withSchedule(CronScheduleBuilder.cronSchedule("0 18 19 * * ? "))
.startNow()
.build();
return trigger;
}


}

3.在專案的web.xml配置監聽器,初始化ApplicationContextListener 

    <listener>
        <listener-class>tcc.test.quartz.ApplicationContextListener</listener-class>
    </listener>
ServletContextListener:tomcat容器啟動時例項化,容器當機時銷燬
執行結果:

 

 五.線上cron表示式地址 https://cron.qqe2.com/

變態一點的表示式:

每個月第二個週週六上午十點

0 0 10 ? * 6#2 *

秒 分 時 日 月 周 年

相關文章