文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

普通web整合quartz跑定时任务的示例

2024-04-02 19:55

关注

一.场景(什么时候用到定时任务)

文件跑批,定时处理数据,和业务解耦的场景

二.目前都有哪些工具可以定时处理数据

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;

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;

public class ApplicationContextListener implements ServletContextListener {
    public static Scheduler scheduler = null;

    
    public ApplicationContextListener() {
        System.out.println("ApplicationContextListener起来了");
    }

    
    //关闭Web应用时,注销定时任务
    public void contextDestroyed(ServletContextEvent arg0) {
        try {
            scheduler.shutdown();
            System.out.println("scheduler.shutdown");
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

    
    //开启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/

到此这篇关于普通web整合quartz跑定时任务的文章就介绍到这了,更多相关web整合quartz定时任务内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯