最近项目中用到了定时任务,以前没有接触过,在此对java中定时任务的实现进行总结。
实现定时任务的方式有2种,一种是使用java类库中的java.util.Timer;另一种是使用quartz框架。
Timer只能实现简单的任务调度,quartz可以满足各种复杂的任务调度时间需求。
1、Timer的实现方式
在Timer中存在一个任务(Task)的概念,通过继承java.util.TimerTask实现,代码如下:
public class MyTask extends TimerTask{
@Override
public void run() {
System.out.println("execute my task!");
}
}
然后使用Timer实例实现任务的触发和调度,代码如下:
public class MyTimer {
public static void main(String[] args) {
Timer timer= new Timer();
// 1秒钟后开始第一次,以后每隔2秒执行一次
timer.schedule(new MyTask(), 1000, 2000);
}
}
Timer的定时任务实现就这么简单。
原理:
1)通过源码可知Timer使用队列(TaskQueue)和线程(TimerThread)实现任务的调度;
2)使用Wait-Notify机制实现队列的阻塞操作;
2、quartz实现方式
Quartz 是个开源的作业调度框架,为java应用程序的作业调度提供了简单却强大的机制。
在quartz中存在一下几个概念:
1)job,相当于timer的task;
2)Trigger(触发器),用来执行job
3)Scheduler(调度器),用来管理Trigger
下面是一个简单例子:
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//获取jobDetail
JobDetail jobDetail = context.getJobDetail();
// 获取jobName
String jobName = jobDetail.getName();
//获取JobDataMap
JobDataMap dataMap = jobDetail.getJobDataMap();
//JobDataMap中获取用户传入的参数
int index = dataMap.getInt("index");
//具体JOB要做的事
for(int i =0;i<index;i++){
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
}
System.out.println("simple job name:"+jobName+" ;turn "+i);
}
}
}
public class QuartzTest {
public static void main(String[] args) {
try {
// 1、创建一个任务调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//2、创建一个作业
JobDetail jobDetail = new JobDetail("simpleJob", Scheduler.DEFAULT_GROUP,
SimpleJob.class);
// 2.1、JobDataMap里面加入需要的参数
jobDetail.getJobDataMap().put("index", 5);
//3、创建触发器,每8秒触发一次
Trigger trigger = TriggerUtils.makeSecondlyTrigger(8);
trigger.setName("simpleTrigger");
//3.1、开始触发时间
trigger.setStartTime(new Date());
// 4、把作业和触发器
scheduler.scheduleJob(jobDetail, trigger);
// 5、启动调度器
scheduler.start();
// 6、关闭调度器
scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
其中JobExecutionContext是quartz提供的一个上下文,从中可以获取job、trigger的信息;
quartz还有许多其他特性,例如job持久化、properties配置文件等,详细可参考最后的链接。
3、spring实现方式
spring对Java的Timer类和Quartz都提供了一个抽象层,使用我们可以更方便地使用它们。
1)spring对Timer的集成
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-autowire="byName">
<bean id="timer" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref local="schedule" />
</list>
</property>
</bean>
<bean id="schedule" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask">
<ref bean="myTask" />
</property>
<property name="delay">
<value>1000</value>
</property>
<property name="period">
<value>1000</value>
</property>
</bean>
<bean id="myTask" class="com.test.MyTask" />
</beans>
2)spring对quartz的集成
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-autowire="byName">
<bean id="myTask" class="com.test.MyTask" />
<!-- jobDetail -->
<bean id="quartzJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myTask" />
<property name="targetMethod" value="run" />
<property name="concurrent" value="false" />
</bean>
<!-- trigger -->
<bean id="quartzTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="quartzJobDetail" />
<property name="cronExpression" value="0/3 * * * * ?"/>
</bean>
<!-- schdule -->
<bean id="quertzSchdule" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="quartzTrigger" />
</list>
</property>
</bean>
</beans>
在spring容器加载配置文件中的bean后,任务调度就会开始。
参考:
相关推荐
java定时任务调度java定时任务调度java定时任务调度java定时任务调度java定时任务调度java定时任务调度
Java使用quartz实现任务调度定时任务
JAVA定时任务调度
例子源码 博文链接:https://zmx.iteye.com/blog/1479582
Quartz--JAVA定时任务\Java应用:Java调度任务和Spring Quartz (1)
Quartz.net作业调度自定义定时执行任务多任务执行c#,定时执行任务,如超时取消订单,自动确认收货等等
java定时任务调度Timer简单示例代码 ,
是一个模拟作业调度过程的操作系统程序,采用JAVA16编写,有图形化界面GUI。该程序包含先进先出算法、优先级优先算法和简单轮转法算法,需要其他算法可以下载我的另一个进程调度资源
本例是java实现的批处理作业调度程序,采用的是回溯法,排列集合的方式,参考书籍为:算法设计与分析
这是一个用Java实现解决批处理作业调度问题的算法
模拟作业调度(时间片轮转法)和进程调度(时间片轮转 法)模拟作业调度系统。
java项目中需要自行编辑写入的定时任务太多时,不要管理,这是一个任务调度项目(包含源码),可视化页面操作。
作业调度问题作业调度问题作业调度问题作业调度问题作业调度问题作业调度问题
Quartz.net做为任务调度核心,利用Log4Net做为日志输出,C#完成WINDOWS服务在后台定时执行任务;
NULL 博文链接:https://rensanning.iteye.com/blog/1836263
配置定时计划,以及定时调度任务, 调度配置工具 ORM基于Dapper实现 日志采用Nlog实现 将程序打包为桌面安装程序,采用Microsoft Visual Studio 2010、2015、2017 Installer Projects实现 调度服务实现 采用Quartz...
java作业调度.doc
incubator-airflow:定时任务管理平台,管理和调度各种离线定时任务,自带 Web 管理界面。当定时任务量达到百级别的时候,就无法再使用 crontab 有效、方便地管理这些任务了。该项目就是为了解决了这个问题而诞生的
Java语言定时调度任务之实现
本实验要求学生模拟作业调度的实现,用高级语言编写和调试一个单道批处理系统的作业调度模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解。 二、 实验题目 编写并调试一个单道批处理系统的...