springMVC + quartz实现定时器(任务调度器)
首先我们要知道任务调度器(定时器)有几种,这边我会写三种
第一种是基于JDK的本身的一个定时器(优点:简单,缺点:满足不了复杂的需求)
package com.timer1; import java.util.Date;
import java.util.TimerTask;
/**
* jdk自带的定时器 不需要引入任何的jar
* @author Administrator
*/
public class JdkTimerTask extends TimerTask {
int a = 1;
@Override
public void run() {
System.out.println("我的定时任务 " + new Date() + " " + a++ );
}
}
测试类
package com.timer1; import java.util.Timer; public class TestTimerTask { public static void main(String[] args) {
// 新建一个 timer
Timer t = new Timer("定时任务");
// 执行我们的定时任务 第一个参数是 定时任务对象 0 是立即开始 3000 每隔3秒钟执行一次
t.schedule(new JdkTimerTask(), 0 , 3000);
}
}
第二种是基于 Quartz的纯代码去实现的, 需要下载Quartz的jar ,而 jar的版本不一样实现的方式又不一样
以下代码是基于 quartz-all-1.6.1.jar 版本 和 quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3) 去实现两种方式的,两种只能选择一种。
package com.timer3; import java.util.Date; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; /**
* 定时任务
* @author Administrator
*/
public class QuartzTimer implements Job {
int a = 1; @Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("我的quartz定时任务" + new Date() + " " + a++); } }
以下是测试方式(注:因为两种模式写在一起了 所以jar包导入可能不对,需要以引用的jar的版本为准)
package com.timer3; import java.text.ParseException;
import java.util.Date; import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory; public class TestQuartzTimer { public static void main(String[] args) throws SchedulerException, ParseException {
/**
* jar 版本 quartz-all-1.6.1.jar
*/
// 新建一个定时任务处理类 jobDetail
//JobDetail jobDetail = new JobDetail("quartzTimer","quartzTimerGroup" , QuartzTimer.class); // 创建定时器触发器
/*SimpleTrigger simpleTrigger = new SimpleTrigger("quartzTimerTrigger", "quartzTimerTriggerGroup");
// 什么时间点执行 new Date()立即启动
simpleTrigger.setStartTime(new Date());
// 执行多少次 10 次
simpleTrigger.setRepeatCount(10);
// 每隔多少秒执行一次 1000是代表1秒
simpleTrigger.setRepeatInterval(1000);*/ // 表达式的触发器 两个触发器只需要一个就好了。
/*CronTrigger cronTrigger = new CronTrigger("quartzTimerCronTrigger", "quartzTimerCronTriggerGroup");
// 新建一个表达式
CronExpression cronExpression = new CronExpression("0/5 32/1 0-23 * * ? *");
// 将表达式放入 触发器
cronTrigger.setCronExpression(cronExpression); // 新建一个计划共工厂
StdSchedulerFactory stdSchedulerFactory = new StdSchedulerFactory();
// 获取到一个计划任务
Scheduler scheduler = stdSchedulerFactory.getScheduler();
// 将定时器任务处理类和触发器结合在一起
scheduler.scheduleJob(jobDetail, cronTrigger);
// 启动触发器
scheduler.start();*/ //quartz 2.X版本以上做法 ++++++++++++++++++++++++++++++++++++++++++++++++
/**
* quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3)
*/
// 通过 schedulerFactory 获取一个调度器
/*SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler(); // 创建 jobDetail 实例,绑定 Job 实现类
// 指明 job 的名称,所在组的名称,以及绑定 job 类
JobDetail job = JobBuilder.newJob(QuartzTimer.class).withIdentity("job1", "group1").build(); // 定义调度触发规则 // SimpleTrigger,从当前时间的下 1 秒开始,每隔 1 秒执行 1 次,重复执行 2 次
Trigger trigger = TriggerBuilder.newTrigger()
// 指明 trigger 的 name 和 group
.withIdentity("trigger1", "group1")
// 从当前时间的下 1 秒开始执行,默认为立即开始执行(.startNow())
.startAt(DateBuilder.evenSecondDate(new Date()))
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1) // 每隔 1 秒执行 1 次
.withRepeatCount(2)) // 重复执行 2 次,一共执行 3 次
.build(); // corn 表达式,先立即执行一次,然后每隔 5 秒执行 1 次
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("*\/5 * * * * ?"))
.build(); // 把作业和触发器注册到任务调度中
sched.scheduleJob(job, trigger); // 启动计划程序(实际上直到调度器已经启动才会开始运行)
sched.start(); // 等待 10 秒,使我们的 job 有机会执行
//Thread.sleep(10000); // 等待作业执行完成时才关闭调度器
//sched.shutdown(true);
*/
}
}
springMVC + Quartz 配置文件的两种实现方式实现 需要用(quartz-2.2.3-distribution(quartz-2.2.3、quartz-jobs-2.2.3) jar包
第一种 需要继承QuartzJobBean
package com.timer4; import java.util.Date; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.quartz.spi.JobFactory;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.scheduling.quartz.QuartzJobBean; /**
* 定时任务
* @author Administrator
*/
public class QuartzTimer extends QuartzJobBean { @Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("我的Spring管理quartz定时任务" + new Date()); } }
spring中的配置方式
<!-- 第一种 -->
<!-- 任务调度处理类工厂 -->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.timer4.QuartzTimer"></property>
</bean>
<!-- 表达式触发器工厂 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail"></property>
<property name="cronExpression" value="0/5 13/1 0-23 * * ? *"></property>
</bean>
<!-- 任务调度计划工厂 -->
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
第二种不需要继承任何类
package com.timer4; import java.util.Date; public class QuartzTimer2 { protected void execute() {
System.out.println("我的Spring管理quartz定时任务2222" + new Date());
}
}
spring 中配置方式
<!-- 第二种 要调度的对象-->
<bean id="jobBean" class="com.timer4.QuartzTimer2" />
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobBean" />
<property name="targetMethod" value="execute" />
<!--将并发设置为false-->
<property name="concurrent" value="false" />
</bean> <bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<!--表达式,我的是每 5s 执行一次-->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean> <!-- 总管理类如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false" >
<property name="triggers">
<list>
<!--作业调度器,list下可加入其他的调度器-->
<ref bean="trigger" />
</list>
</property>
</bean>
Spring + SpringMVC + Quartz jar下载地址:http://pan.baidu.com/s/1nuHIUvv ,密码 :28ar
springMVC + quartz实现定时器(任务调度器)的更多相关文章
- 企业级任务调度框架Quartz(6) 任务调度器(Scheduler)
前序: 我们已经在前面的内容能里看到了,我们用 Scheduler 来管理我们的 Job:创建并关联触发器以使 Job 能被触发执行:以及如可选择 calendar 为给定的时程安排提供更多 ...
- 企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上
前序: 在第一个例子我看到了自定义的作业类在任务调度器上注册后,则通过任务调度器来实现启动:下面,我们将同一个作业类执行两个任务,并都将他们注册到任务调度器上! 首先一个job类指向两 ...
- 在springboot项目中引入quartz任务调度器。
quartz是一个非常强大的任务调度器.我们可能使用它来管理我们的项目,常见的是做业绩统计等等.当然它的功能远不止这些.我们在这里不介绍quartz的原理,下面讲讲如何在springboot中使用qu ...
- SpringBoot2 task scheduler 定时任务调度器四种方式
github:https://github.com/chenyingjun/springboot2-task 使用@EnableScheduling方式 @Component @Configurabl ...
- Quartz是一个任务调度
这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作.由于没有用过Quartz是一个任务调度,一直使用这个办法,今天通过同事提点,从 ...
- 基于 Quartz 开发企业级任务调度应用
原文地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/index.html Quartz 基本概念及原理 Quartz S ...
- 基于 Quartz 开发企业级任务调度应用--转
Quartz 基本概念及原理 Quartz Scheduler 开源框架 Quartz 是 OpenSymphony 开源组织在任务调度领域的一个开源项目,完全基于 Java 实现.该项目于 2009 ...
- 项目ITP(六) spring4.0 整合 Quartz 实现动态任务调度
前言 系列文章:[传送门] 项目需求: http://www.cnblogs.com/Alandre/p/3733249.html 上一博客写的是基本调度,后来这只能用于,像每天定个时间 进行数据库备 ...
- 使用spring整合Quartz实现—定时器
使用spring整合Quartz实现—定时器(Maven项目做演示) 不基于特定的基类的方法 一,开发环境以及依赖的jar包 Spring 4.2.6.RELEASE Maven 3.3.9 Jdk ...
随机推荐
- 中证500等主要指数的市盈率(PE)估值高度
全指医药(SH000991) - 2018-10-18日,当前值:22.8575,平均值:36.88,中位数:36.27655,当前 接近历史新低.全指医药(SH000991)的历史市盈率PE详情 中 ...
- SQL Compare数据库比较工具 完全破解+使用教程
来源http://www.cnblogs.com/duci/articles/4482665.html 一.使用教程 SQL Compare是编程人员常用的比较两个数据库之间差异的工具.可以用来比较数 ...
- Eclipse------用Tomcat运行项目后出现:严重: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
Eclipse中Tomcat运行项目后出现: 严重: Error configuring application listener of class org.springframework.web.c ...
- 3D物体识别的如果检验
3D物体识别的如果验证 这次目的在于解释怎样做3D物体识别通过验证模型如果在聚类里面.在描写叙述器匹配后,这次我们将执行某个相关组算法在PCL里面为了聚类点对点相关性的集合,决定如果物体在场景里面的实 ...
- Ruby Tutorial
http://www.tutorialspoint.com/ruby/ruby_quick_guide.htm http://www.cnblogs.com/PurpleCow/archive/201 ...
- Win7 如何访问XP系统里的网上邻居?
Win7 如何访问XP系统里的网上邻居? [ 标签:win7,xp系统 ] 现有两台电脑,一台XP,一台WIN7,共用一个无线路由器(两者都是经无线网络连接路由器).可以从XP里访问WIN7里的共享文 ...
- python 学习笔记---文件处理
1.打开文件读取数据 f =open(“wenjian.txt”,"r") print(f) f.close() 直接变成列表--->list(f) for each_lin ...
- N76E003的学习之路(一)
N76E003是8051内核的一款单片机MCU,它提供丰富的特殊功能模块,包括: 1KRAM其中包括256字节SRAM,768字节XRAM. 最多可达18个标准管脚. 两组标准16位定时器/计数器:定 ...
- opencv3——ANN算法的使用
最近刚转用opencv3,使用ANN算法时遇到了一些问题,记录下来. 训练神经网络的代码如下: //创建ANN Ptr<ANN_MLP> bp = ANN_MLP::create(); 设 ...
- 【HubbleDotNet】HubbleDotNet配置安装注册key获取
今天配置HubbleDotNet发现一个问题 安装界面需要注册key 点击[get key],跳转网页: http://www.hubbledotnet.com/key.aspx 结果网页有bug,坑 ...