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

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

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

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. NoSuchMethodError错误

    发生原因: 一个项目中包含有相同名字,但内容不同的包 解决办法:删除其中暂时不用的包 后记:如果不知道哪一个包是多余的,直接用IDE查找:找到该类,然后将该包进行反编译,再次导入该项目,再找到该类,出 ...

  2. 浅谈AngularJS中使用$resource

    这个服务可以创建一个资源对象,我们可以用它非常方便地同支持RESTful的服务端数据源进行交互,当同支持RESTful的数据模型一起工作时,它就派上用场了. REST是Representational ...

  3. JAVA初学--Servlet详解

    一.什么是servlet? 处理请求和发送响应的过程是由一种叫做Servlet的程序来完成的,并且Servlet是为了解决实现动态页面而衍生的东西.理解这个的前提是了解一些http协议的东西,并且知道 ...

  4. Redis的配置文件redis.conf详解

    Redis的配置文件位于redis的安装目录下,一般不要直接操作出厂设置的配置文件,需要对其进行备份.# Redis的配置文件样例: # Redis configuration file exampl ...

  5. Java开发调试技巧及Eclipse快捷键使用方法

    1. 快捷键 syso 通过打印输出来调试,println可接受object型的参数,能输出任何类型 Syso输出的是黑色字体,代表的是Debug的信息 Syse,输出的是红色字体,代表错误的输出信息 ...

  6. jqGrid 修改单元格值或者替换图片及其他

     var rowIds = jQuery("#list1").jqGrid('getDataIDs');                for (var k = 0; k < ...

  7. 总结Tomcat优化方法

    一.内存空间优化 配置文件目录:/usr/local/tomcat/bin/catalina.sh JAVA_OPTS="-server -Xms4g -Xmx4g -XX:NewSize= ...

  8. 使用haproxy的ACL实现基于文件后缀名的动静分离

    一.环境准备 二.实现proxy [root@localhost ~]# yum -y install haproxy #创建子配置 [root@localhost ~]# mkdir /etc/ha ...

  9. IT职业技能图谱:架构师、H5、DBA、移动、大数据、运维...

    转载 作者:StuQ 文章收藏自微信:InfoQ   时隔近5个月,StuQ的小伙伴们再次出品了IT职业技能图谱更新版.这回除更新之前版本外,还添加了架构师.HTML 5.DBA等新的职业技能图谱.正 ...

  10. simulink模块执行顺序

    1.simulink各模块执行顺序 Simulink模块的执行顺序都是序贯进行的,也就是沿着信号的流向进行.没有输入的模块先进行计算,更新状态量与输出,需要输入信号的模块等到输入信号准备ready之后 ...