普通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 *
秒 分 时 日 月 周 年
普通web整合quartz跑定时任务的更多相关文章
- springboot整合Quartz实现定时任务
1.maven依赖: <!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> ...
- 【spring-boot】 springboot整合quartz实现定时任务
在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用s ...
- SpringMVC整合Quartz实现定时任务以及Tomcat服务执行初始化定时任务
1.导入quartz.jar包,或者pom.xml 配置对应的依赖: <dependency> <groupId>org.quartz-scheduler</groupI ...
- Spring Boot整合Quartz实现定时任务表配置
最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...
- spring整合quartz实现定时任务
需求:spring+mybatis框架已经搭建好,需要实现一个定时任务. 一:导出相应的jar包 quartz-all-1.6.5.jar获取quartz-alll-1.6.6.jar spring- ...
- Spring整合Quartz分布式定时任务
概述虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一部 ...
- Spring整合Quartz定时任务执行2次,Spring定时任务执行2次
Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...
- Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复(附带源码)
摘要:在项目的管理功能中,对定时任务的管理有时会很常见.但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化, ...
- Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)
Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境) 转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...
随机推荐
- aws 试题
/* Domain 1 Design Resilient Architectures 1. Which of the following statements regarding S3 storage ...
- Java高并发下多线程编程
1.创建线程 Java中创建线程主要有三种方式: 继承Thread类创建线程类: 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此也把run方法称为 ...
- C++的set重载运算符
转载: https://www.cnblogs.com/zhihaospace/p/12843802.html set 容器模版需要3个泛型参数,如下: template<class T, cl ...
- ApacheCN 数据科学译文集 20211109 更新ApacheCN 数据科学译文集 20211109 更新
计算与推断思维 一.数据科学 二.因果和实验 三.Python 编程 四.数据类型 五.表格 六.可视化 七.函数和表格 八.随机性 九.经验分布 十.假设检验 十一.估计 十二.为什么均值重要 十三 ...
- kafka经验
1.kafka集群搭建 解压 配环境变量 修改配置文件 2.编写管理脚本去管理集群 3.kafka常用命令 4.kafka监控 5.分享kafka经验
- git init和git init –bare的区别:
感谢原文作者:ljchlx 原文链接:https://blog.csdn.net/ljchlx/article/details/21805231 git init 和 git init –bare 的 ...
- 7.2.*PHP编译安装时常见错误解决办法,php编译常见错误
configure: error: Cannot find ldap.h 检查下面是不是已经安装,如果没有安装之:检查:yum list openldapyum list openldap-dev ...
- ListIterator特有的方法
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /* 迭代 listIterator ...
- Redis 源码简洁剖析 13 - RDB 文件
RDB 是什么 RDB 文件格式 Header Body DB Selector AUX Fields Key-Value Footer 编码算法说明 Length 编码 String 编码 Scor ...
- Redis入门与实践(附项目真实案例代码)
我是3y,一年CRUD经验用十年的markdown程序员常年被誉为优质八股文选手 今天继续更新austin项目,如果还没看过该系列的同学可以点开我的历史文章回顾下,在看的过程中不要忘记了点赞哟!建议 ...