JDK中任务调度核心是Timer类的schedule方法,传递一个继承TimerTask实现了run方法的类。
在Spring的xml文件中配置
<!-- 单一任务 -->
<bean id="reportTask" class="example.chapter9.ReportTimerTask" />
<!-- 周期性任务 -->
<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<!-- 启动后等待10秒,然后开始执行 -->
<property name="delay" value="10000" />
<!-- 每60秒执行一次 -->
<property name="period" value="60000" />
<property name="timerTask" ref="reportTask" />
</bean>
<!-- 启动任务的工厂 -->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTask" />
</list>
</property>
</bean>
<!-- 另一中建立任务的方法,reportTask不用继承TimerTask -->
<bean id="scheduledTaskInvoke" class="
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="reportTask"/>
<property name="targetMethod" value="run"/>
</bean>
使用Quartz调度任务
Quartz中的几个概念
Job:定义一个任务,Job只管执行,不管什么时间执行,不管执行多少次
Trigger:定义一个出发器,表示何时触发一个Job执行,一个Job可以和多个Trigger关联
Scheduler:真正调度任务的调度器,通过scheduler(Job, Trigger)方法把关联了Tragger的Job放入调度器中执行
public class SimpleQuartz {
public static void main(String[] args) throws SchedulerException {
SchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
// 定义任务
JobDetail jobDetail = new JobDetail("myJob", null, AJob.class);
// 每3秒一次
Trigger trigger = TriggerUtils.makeSecondlyTrigger(3);
// 开始时间
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
trigger.setName("myTrigger");
scheduler.scheduleJob(jobDetail, trigger);
}
}
public class AJob implements Job{
public void execute(JobExecutionContext arg0) throws JobExecutionException {
System.out.println("xxxx");
}
}
Spring提供两种方式来封装Quartz的Job,一种是直接派生自QuartzJobBean,
public class Report extends QuartzJobBean {
private String name;
public void setName(String name) {
this.name = name;
}
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Send report to " + name + " at " + new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在xml配置文件中将Report包装为JobDetailBean
<bean name="reportJob"
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="example.chapter9.Report" />
<property name="jobDataAsMap">
<map>
<entry key="name" value="Micheal" />
</map>
</property>
</bean>
Spring会自动将jobDataAsMap属性中注入的Map按照Key注入到Report对象
另一种方式是POJO实现,
public class CheckDiskFreeSpace {
public void check() {
// get disk free space:
long freeSpace = Math.random() > 0.5 ? 100000000 : 200000000;
System.out.println("Check disk free space at " + new Date());
if (freeSpace < 100 * 1024 * 1024) { // <100MB
System.out.println("Warning! Low disk free space...");
}
}
}
<bean name="checkDiskFreeSpace" class="example.chapter9.CheckDiskFreeSpace" />
<bean name="checkDiskJob" class="
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="checkDiskFreeSpace" />
<property name="targetMethod" value="check" />
<!-- 能否同时有多个Job执行 -->
<property name="concurrent" value="false" />
</bean>
下一步是定地Trigger,
Spring封装了两种常用的TriggerBean,一种是SimpleTriggerBean,可以周期性执行Job
<!-- 周期性运行checkDiskJob -->
<bean id="repeatTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="checkDiskJob" />
<!-- 1分钟后启动 -->
<property name="startDelay" value="60000" />
<!-- 5分钟检查一次 -->
<property name="repeatInterval" value="300000" />
</bean>
另一种是CronTriggerBean功能更强大,能指定何时执行Job
<!-- 定时运行reportJob -->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reportJob" />
<!-- 每周周一至周五中午12:00执行 -->
<property name="cronExpression" value="0 0 12 ? * MON-FRI" />
</bean>
cronExpression表达式
字段 允许值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /
最后只需启动Scheduler
<bean id="scheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="repeatTrigger" />
<ref bean="cronTrigger" />
</list>
</property>
</bean>
附表:
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 * ?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发
至于每个符号 看看例子就好了.很简单了.
分享到:
相关推荐
本实践主要涉及Spring集成两种常见的任务调度库:Spring的Timer和Quartz。这两者都允许开发者在预定义的时间间隔内执行任务,极大地提高了应用的灵活性和效率。下面将详细介绍这两个任务调度工具及其在Spring中的...
### 知识点一:SpringBoot集成任务调度 SpringBoot通过集成SpringFramework中的@Scheduled注解来实现任务的定时调度。@Scheduled注解支持cron表达式,这允许开发者以非常灵活的方式定义任务执行的具体时间点和频率...
Spring Task是Spring内置的轻量级任务调度器,而Quartz是更强大的第三方调度库,可以在Spring中集成使用。 1. **Spring Task** - **基本概念**:Spring Task是Spring框架的一部分,提供了基本的定时任务调度功能,...
Java任务调度工具是Java开发中一个非常重要的组件,主要用于自动化执行特定的任务,如数据同步、报表生成、系统维护等。当项目中的定时任务数量增加,手动管理这些任务变得复杂且容易出错时,引入任务调度工具显得尤...
首先,Spring提供了两种主要的任务调度机制:Spring内置的`TaskExecution`和`TaskScheduling`以及与Quartz Scheduler的集成。`TaskExecution`和`TaskScheduling`是Spring框架的基础任务调度API,它们允许开发者创建...
在IT行业中,任务调度管理是一项至关重要的工作,它涉及到系统的高效运行和资源的优化配置。本文将深入探讨“任务调度管理”这一主题,以及与之相关的“xxl-job-master”项目。 任务调度管理是一个用于自动执行预定...
在本文中,我们将深入探讨如何在Spring中集成Quartz进行任务调度,并通过一个简单的示例来理解其工作原理。 首先,要在Spring中使用Quartz,你需要将`quartz-all-1.5.2.jar`等相关的Quartz库添加到项目的类路径中。...
3. **可扩展性**:允许开发者自定义任务实现类,可以方便地将已有的业务逻辑集成到任务调度中。 4. **监控与日志**:提供任务执行状态的实时监控,以及详细的执行日志记录,便于问题排查和系统优化。 5. **异常...
Spring框架提供了强大的任务调度能力,使得开发者能够轻松地集成和管理定时任务。本资料“Spring实现任务调度”将深入探讨如何在Spring中设置和管理定时任务。 首先,我们需要理解Spring中的任务调度机制。Spring...
JobX作为opencron的升级版,是一款专为Linux环境设计的定时任务调度系统,它不仅具备强大的定时任务管理功能,还集成了Linux实时监控与WebSSH等功能,极大地提高了运维效率。 **核心功能与优势** 1. **自动化管理...
本文将详细解析标题为“基于51单片机的合作式任务调度器在Keil中编译通过”的项目,以及如何在Keil集成开发环境中实现和运用这个调度器。 首先,我们要理解什么是合作式任务调度。合作式任务调度是一种多任务处理...
总结来说,STM32 UCOS简单任务调度涉及到STM32微控制器、uC/OS实时操作系统以及Cortex-M3处理器的集成和应用。通过理解这些核心技术,开发者可以构建出高效、可靠的嵌入式系统,实现复杂的任务管理。在具体实践中,...
在当前信息技术领域中,随着数据量的增长和数据仓库的规模不断扩大,数据集成任务也随之增多,单机调度已经无法高效应对大量复杂的ETL(Extraction, Transformation, Loading)任务。为了解决ETL任务调度效率低下、...
- **动态管理**:任务的增删改查、启停操作、任务分组等都可以在线完成,无需重启调度服务。 - **丰富的调度策略**:支持定时、周期、一次性、依赖等多种调度策略。 - **日志追踪**:详细记录任务执行日志,便于...
任务调度算法在云环境中扮演着至关重要的角色,它决定了任务如何在多台虚拟机或物理机器之间分配,以达到最小化延迟、最大化资源利用率或提高服务质量等目标。常见的任务调度算法有优先级调度、最早截止时间优先...
"XXL-JOB分布式任务调度系统培训PPT" XXL-JOB分布式任务调度系统是当前 Java 生态中的一种流行的分布式任务调度系统。它提供了多种功能特性,如支持 cron 表达式、支持多种任务类型、支持任务优先级、支持任务依赖...
lite-job 是一个轻量级的分布式任务调度系统,特别适合于微服务架构中的任务调度需求。这个系统的设计目标是简单易用、高可用和可扩展。在Android开发中,它作为一个Android Studio插件,可以方便地帮助开发者进行...
Quartz 提供了一套丰富的 API 和支持,可以方便地与 Spring 框架集成,实现灵活的定时任务调度。 在 Spring 中集成 Quartz,首先需要创建一个 Java 类作为定时任务的执行体,例如 `MyJob` 类。这个类通常包含一个...
描述中提到的“win7计划任务调度kettle文件”可能包含了一种方法,即通过Windows 7的内置计划任务服务来替代Kettle的内部调度器,从而避免因内存问题导致的进程被终止。这种方式可以让Kettle作业或转换在指定时间...
Spring集成Quartz是一款高效的任务调度框架,用于在Java应用程序中执行计划、周期性的任务。Quartz与Spring的结合,使得我们可以充分利用Spring的依赖注入(DI)和AOP特性,简化了任务调度的复杂性。 首先,Quartz...