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

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

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

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跑定时任务的更多相关文章

  1. springboot整合Quartz实现定时任务

    1.maven依赖: <!--quartz--> <dependency> <groupId>org.quartz-scheduler</groupId> ...

  2. 【spring-boot】 springboot整合quartz实现定时任务

    在做项目时有时候会有定时器任务的功能,比如某某时间应该做什么,多少秒应该怎么样之类的. spring支持多种定时任务的实现.我们来介绍下使用spring的定时器和使用quartz定时器 1.我们使用s ...

  3. SpringMVC整合Quartz实现定时任务以及Tomcat服务执行初始化定时任务

    1.导入quartz.jar包,或者pom.xml 配置对应的依赖: <dependency> <groupId>org.quartz-scheduler</groupI ...

  4. Spring Boot整合Quartz实现定时任务表配置

    最近有个小项目要做,spring mvc下的task设置一直不太灵活,因此在Spring Boot上想做到灵活的管理定时任务.需求就是,当项目启动的时候,如果有定时任务则加载进来,生成schedule ...

  5. spring整合quartz实现定时任务

    需求:spring+mybatis框架已经搭建好,需要实现一个定时任务. 一:导出相应的jar包 quartz-all-1.6.5.jar获取quartz-alll-1.6.6.jar spring- ...

  6. Spring整合Quartz分布式定时任务

    概述虽然单个Quartz实例能给予你很好的Job调度能力,但它不能满足典型的企业需求,如可伸缩性.高可靠性满足.假如你需要故障转移的能力并能运行日益增多的 Job,Quartz集群势必成为你应用的一部 ...

  7. Spring整合Quartz定时任务执行2次,Spring定时任务执行2次

    Spring整合Quartz定时任务执行2次,Spring定时任务执行2次 >>>>>>>>>>>>>>>&g ...

  8. Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复(附带源码)

    摘要:在项目的管理功能中,对定时任务的管理有时会很常见.但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化, ...

  9. Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)

    Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境)   转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...

随机推荐

  1. aws 试题

    /* Domain 1 Design Resilient Architectures 1. Which of the following statements regarding S3 storage ...

  2. Java高并发下多线程编程

    1.创建线程 Java中创建线程主要有三种方式: 继承Thread类创建线程类: 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此也把run方法称为 ...

  3. C++的set重载运算符

    转载: https://www.cnblogs.com/zhihaospace/p/12843802.html set 容器模版需要3个泛型参数,如下: template<class T, cl ...

  4. ApacheCN 数据科学译文集 20211109 更新ApacheCN 数据科学译文集 20211109 更新

    计算与推断思维 一.数据科学 二.因果和实验 三.Python 编程 四.数据类型 五.表格 六.可视化 七.函数和表格 八.随机性 九.经验分布 十.假设检验 十一.估计 十二.为什么均值重要 十三 ...

  5. kafka经验

    1.kafka集群搭建 解压 配环境变量 修改配置文件 2.编写管理脚本去管理集群 3.kafka常用命令 4.kafka监控 5.分享kafka经验

  6. git init和git init –bare的区别:

    感谢原文作者:ljchlx 原文链接:https://blog.csdn.net/ljchlx/article/details/21805231 git init 和 git init –bare 的 ...

  7. 7.2.*PHP编译安装时常见错误解决办法,php编译常见错误

    configure: error: Cannot find ldap.h   检查下面是不是已经安装,如果没有安装之:检查:yum list openldapyum list openldap-dev ...

  8. ListIterator特有的方法

    import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /* 迭代 listIterator ...

  9. Redis 源码简洁剖析 13 - RDB 文件

    RDB 是什么 RDB 文件格式 Header Body DB Selector AUX Fields Key-Value Footer 编码算法说明 Length 编码 String 编码 Scor ...

  10. Redis入门与实践(附项目真实案例代码)

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为优质八股文选手 今天继续更新austin项目,如果还没看过该系列的同学可以点开我的历史文章回顾下,在看的过程中不要忘记了点赞哟!建议 ...