• <menu id="sssag"></menu>
  • <menu id="sssag"></menu>
  • 普通web整合quartz跑定時任務

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

    文件跑批,定時處理數據,和業務解耦的場景

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

    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 *

    秒 分 時 日 月 周 年

    posted @ 2022-03-07 20:04  武魂95級藍銀草  閱讀(167)  評論(0編輯  收藏  舉報
    国产在线码观看超清无码视频,人妻精品动漫H无码,十大看黄台高清视频,国产在线无码视频一区二区三区,国产男女乱婬真视频免费,免费看女人的隐私超爽,狠狠色狠狠色综合久久蜜芽