• 普通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 *

    秒 分 时 日 月 周 年

  • 相关阅读:
    linux之sed用法【转载】
    关于Cookie和Session【转载】
    Oracle分页查询与RowNum
    fstream的用法
    Java:Date、Calendar、Timestamp的区别、相互转换与使用【转载】
    DatabaseMetaData的用法【转载】
    关于SQL的Group By
    【转载】B树、B-树、B+树、B*树都是什么
    Spring的MVC控制器返回ModelMap时,会跳转到什么页面?
    关于jsp中超链接的相对路径
  • 原文地址:https://www.cnblogs.com/tongcc/p/15977733.html
Copyright © 2020-2023  润新知