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

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

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

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. Android性能优化之Android 10+ dex2oat实践

    作者:字节跳动终端技术--郭海洋 背景 对于Android App的性能优化来说,方式方法以及工具都有很多,而dex2oat作为其中的一员,却可能不被大众所熟知.它是Android官方应用于运行时,针 ...

  2. CSS之创意hover效果

    一.发送效果 HTML <div id="send-btn"> <button> // 这里是一个svg的占位 Send </button> & ...

  3. axios 之cancelToken原理以及使用

    看axios文档的时候发现cancelToken这个东东,这个是用来取消ajax请求的,一般原生的话用的是abort()这个方法.看到这玩意的第一感觉是用起来有点麻烦,但是看了内部实现,发现还是比较有 ...

  4. 关于CSS3样式中的前缀问题

    作为新手,有的时候在写css时分不清什么属性需要用到前缀,或者用什么前缀,下面是我平时学习的一些总结. 在了解这些前缀之前,先介绍一下各大主流浏览器的内核: IE--trident(国内很多双核浏览器 ...

  5. eclipse使用的步骤

    eclipse使用的步骤: 第一步: 选择工作目录. 以后在Eclipse上面写的所有代码都是在工作目录上的. 第二步: 在Project Exploer 窗口上创建一个工程,以后我们写代码都是以工程 ...

  6. Docker部署lnmp 实战 (多注意配置文件,不管访问试试换个浏览器)

    Docker部署LNMP环境 关闭防火墙,设置自定义网络 systemctl stop firewalld systemctl disable firewalld setenforce 0 docke ...

  7. c++ 堆栈和内存管理

    stack(栈),heap(堆) Stack:是存在于某作用域(scope)的一个内存空间(memory space).例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,返回地址 ...

  8. Solution -「NWRRC 2017」「洛谷 P7024」Fygon 2.0

    \(\mathcal{Description}\)   Link.   给定一个无并列语句的多重循环,每个变量取值的左端点只能是 \(1\) 或已定义的变量:右端点只能是 \(n\) 或已定义的变量. ...

  9. CPU使用率过高怎么办

    实际上前文中关于CPU使用率过高如何通过各种工具获得相关的热点进程.那么进程有了,那得疑惑到底哪个哪段代码导致了这个进程成为热点呢? 如果在调试阶段,可以使用gdb中断运行,但是在生产环境肯定不行.L ...

  10. Numpy的各种下标操作

    技术背景 本文所使用的Numpy版本为:Version: 1.20.3.基于Python和C++开发的Numpy一般被认为是Python中最好的Matlab替代品,其中最常见的就是各种Numpy矩阵类 ...