目录
- 一.场景(什么时候用到定时任务)
- 二.目前都有哪些工具可以定时处理数据
- 三.如何集成
- 1.jar包下载
- 2.理解几个核心概念
- 四.配置示例
- 五.在线cron表达式
一.场景(什么时候用到定时任务)
文件跑批,定时处理数据,和业务解耦的场景
二.目前都有哪些工具可以定时处理数据
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/
到此这篇关于普通web整合quartz跑定时任务的文章就介绍到这了,更多相关web整合quartz定时任务内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!