实现任务的自动调度:
系统中常常有些需要自动执行的任务,这些任务可能每隔一段时间就要执行,也可能需要在指定时间点自动执行,这些任务的自动执行必须使用任务的自动调度。
一、使用Quartz
1、下载和安装Quartz请按下步骤:
登陆:http://www.quartz-scheduler.org/站点下载Quartz的最新版本。
docs:存在Quartz的相关文档,包括API文档
examples:存放Quartz的示例程序
javadoc:存放Quartz的API文档
lib:存放Quartz的jar包
src:存放Quartz的源文件
2、将Quartz.2.2.1.jar文件添加到WEB-INF/lib路径下
3、提供一个quartz.properties配置文件,通过配置文件,可以修改框架运行时的环境。将quartz.properties文件放在类路径下。ClassLoader会自动加载并启动其中的各种属性。
quartz.properties范例如下:
//配置主调度器属性
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
//配置线程池、线程池实现类
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 15
//配置线程池里线程的优先级
org.quartz.threadPool.threadPriority = 5
//配置作业存储
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
Quartz提供两种作业存储方式:
1)、RAMJobStore,它利用内存来持久化调度程序信息,由于调度信息存储在JVM内存里,程 序终止,所有的调度信息就会丢失
2)、JDBC作业存储。需要JDBC驱动程序和后台数据库保存调度信息,有需要调度的程序维护 调度信息的用户来设计
大部分时候,RAMJobStore存储方式就足够了。
4、Quartz里的作业
Quartz里的作业需要实现org.quartz.job接口,该job接口包含一个方法execute(),execute()方法体是被调度的作业。
一旦实现了job接口和execute()方法,当Quartz调度改作业时,该execute()就会自动执行。
以下是该实例的作业:
程序清单:codes\10\QuartzQs\src\lee\TestJob.java
public class TestJob implements Job{
//判断作业是否执行的旗标
private boolean isRunning =false;
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getMergedJobDataMap()
String getFileToRemoteFTPHost
= jobDataMap.getString("GetFileToRemoteFTPHost");
if(! isRunning ){
System.out.println(new Date(0 + " 作业被调度“);
for(int i=0;i<100;i++){
System.out.println("作业完成” + (i+1));
try{
Thread.sleep(100);
}catch(InterruptedException ex){
ex.printStackTrace();
}
}
System.out.println(new Date() +"作业调度结束);
}else {
System.out.println(new Date() +"任务退出“);
}
}
}
5、Quartz调度器
调度器用于将任务与触发器关联起来,一个任务可关联多个触发器,一个触发器也可用于控 制多个任务。
以下是一个将多个任务与触发器关联的例子:
1)、添加配置文件:ItxTransportParameters.xml
ItxTransportParameters.xml配置文件如下:
<?xml version="1.0" encoding="GBK"?>
<ItxTransportParameters>
//如果有多个作业可以添加读个job标签
<job>
<job-detail>
<name>TestJob</name>
<group>FTP</group>
<job-class>src.lee.TestJob</job-class>
//作业需要的属性值
<job-data-map allows-transient-data="true">
<entry>
<key>GetFileFromPath</key>
<value>/home/bea</value>
</entry>
</job-data-map>
</job-detail>
//任务调度的时间
<trigger>
<cron>
<name>TestJobJobTrigger</name>
<group>FTP</group>
<job-name>TestJob</job-name>
<job-group>FTP</job-group>
<cronExpression>0 0/3 0-23 * * ?</cronExpression>
</cron>
</trigger>
</job>
</ItxTransportParameters>
2)、任务调度
public class ItxTransportListener {
private List<Scheduler> schedulers = new ArrayList<Scheduler>();
String configFileName = "ItxTransportParameters.xml";
public static void main(String[] args) {
ItxTransportListener server= new ItxTransportListener();
try {
server.startScheduler();
} catch (Exception ex) {
ex.printStackTrace();
server.stop();
}
//执行调度
public void startScheduler() throws SchedulerException {
//解析itxparameter.xml中jobDetil节点,创建JobDetail
Element testConfig
= XMLUtils.parseElement(cl.getResourceAsStream(configFileName));
NodeList tcpConfigs = testConfig.getElementsByTagName("job");
for (int i = 0; i < tcpConfigs.getLength(); i++) {
Element jobElem = (Element) tcpConfigs.item(i);
Element jobDetailElem
= (Element) jobElem.getElementsByTagName("job- detail").item(0);
String name
= jobDetailElem.getElementsByTagName("name")
.item(0).getFirstChild().getNodeValue();
String group
= jobDetailElem.getElementsByTagName("group")
.item(0).getFirstChild().getNodeValue();
String jobClass
= jobDetailElem.getElementsByTagName("job-class")
.item(0).getFirstChild().getNodeValue();
//使用工厂创建调度器实例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//创建JobDetail实例
JobDetail jobDetail = new JobDetail(name, group, Class.forName(jobClass));
//将itxtransparameter.xml中,定时器的key、value保存到jobDetail中
for(int j = 0; j < jobDetailElem.getElementsByTagName("entry").getLength(); j++){
Element jobDataElem
= (Element) jobDetailElem.getElementsByTagName("entry").item(j);
String key
= jobDataElem.getElementsByTagName("key")
.item(0).getFirstChild().getNodeValue();
NodeList list = jobDataElem.getElementsByTagName("value");
if(list != null){
if(list.getLength() == 1 && list.item(0).getFirstChild() != null){
String value = list.item(0).getFirstChild().getNodeValue();
jobDetail.getJobDataMap().put(key, value);
} else if(list.getLength() > 1){
List<String> values = new ArrayList<String>();
for(int index = 0; index < list.getLength(); index ++){
String value = list.item(index).getFirstChild().getNodeValue();
if(StringUtils.isNotBlank(value))
values.add(value);
}
jobDetail.getJobDataMap().put(key, values);
}
}
}
//解析配置文件中Trigger节点,创建调度器Trigger
Trigger trigger = null;
Element triggerElem = (Element) jobElem.getElementsByTagName("trigger").item(0);
Element cronTriggerElem
= (Element) triggerElem.getElementsByTagName("cron").item(0);
name
= cronTriggerElem.getElementsByTagName("name").item(0)
.getFirstChild().getNodeValue();
group = cronTriggerElem.getElementsByTagName("group")
.item(0).getFirstChild().getNodeValue();
String cronExpression = cronTriggerElem
.getElementsByTagName("cronExpression")
.item(0).getFirstChild().getNodeValue();
//创建Trigger对象,该对象是调度器
Trigger trigger = new CronTrigger(name, group, cronExpression);
//将作业与调度关联起来
scheduler.scheduleJob(jobDetail, trigger);
//启动调度器
scheduler.start();
schedulers.add(scheduler);
}
public void stop() throws SchedulerException {
for (Scheduler scheduler : schedulers)
scheduler.shutdown();
}
}
}
二、spring Quatrz
1、作业,继承QuartzJobBean 类,覆盖其executeInternal方法
程序清单:codes\10\HRSystem\Web-INF\src\org\crazyit\hrsystem\schedule\PunchJob.java
public class PunchJob extends QuartzJobBean{
private boolean isRunning =false;
private EmpManager empMgr;
public void setEmpMgr(EmpManager empMgr){
this.empMgr = empMgr;
}
public void executeInternal(JobExecutionContext ctx)
throws JobExecutionException{
if(!isRunning){
System.out.println("开始调度自动打卡”);
isRunning = true;
//调用业务逻辑方法
empMgr.autoPunch();
isRunning = false;
}
}
2、在spring配置文件中添加如下配置
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="configLocation" value="classpath:quartz.properties"/>
<property name="triggers">
<list>
<ref bean="PunchJobTrigger" />
</list>
</property>
</bean>
<bean id="PunchJobLauncherDetail" class=
"org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="org.crazyit.hrsystem.schedule.PunchJob.java" />
<property name="group" value="quartz-reconcile" />
<property name="jobDataAsMap">
<map>
<entry key="jobName" value="dbsAutoPayRequestReconcileJob" />
</map>
</property>
</bean>
<bean id="PunchJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="PunchJobLauncherDetail" />
<property name="cronExpression" value="0 0 5 * * ?" />
</bean>
相关推荐
3. **调度器配置**:`SchedulerFactoryBean`是Spring对Quartz调度器的包装,它管理所有的触发器和任务。在这里,我们将`cron`触发器添加到调度器中,使得任务与触发器关联起来。 接下来,我们看下服务类和服务的...
里面包含了两个工程项目: 1.Java project工程(含jar包,JDK1.6)。 是spring+quartz的任务调度实例。 2.Java web工程(含jar包,JDK1.7)。 spring+mybatis+quartz任务调度实例
总的来说,Quartz任务调度器与Spring的整合使得我们能够在应用中轻松地实现定时任务的管理,而无需关心任务执行的具体细节。它为开发者提供了一套强大的工具,帮助我们在项目中实现定时任务的自动化,提高系统的运行...
Spring框架和Quartz是两个广泛使用的工具,它们可以协同工作以实现复杂和灵活的任务调度。本篇文章将深入探讨如何使用Spring与Quartz结合来创建一个任务调度的小例子。 首先,Spring是一个开源的Java企业级应用开发...
Spring Task是Spring内置的轻量级任务调度器,而Quartz是更强大的第三方调度库,可以在Spring中集成使用。 1. **Spring Task** - **基本概念**:Spring Task是Spring框架的一部分,提供了基本的定时任务调度功能,...
Spring框架作为一个全面的企业级应用开发解决方案,提供了强大的任务调度支持,而Quartz则是一个流行的开源作业调度库,能够与Spring很好地集成。现在,我们就来深入探讨"spring quartz 任务调度"这一主题。 首先,...
本项目"spring+quartz任务调度代码版"显然是一个结合了这两者的实践案例,旨在展示如何在Spring环境下集成和使用Quartz进行任务调度。 Spring框架是一个开源的应用框架,它提供了丰富的功能,包括依赖注入、AOP...
**Spring Quartz 任务调度** Spring Quartz 是一个基于 Java 的任务调度框架,它允许开发者定义定时任务并在应用程序中灵活地调度这些任务。这个框架是 Spring 和 Quartz Scheduler 的集成,提供了与 Spring 框架的...
Spring Quartz 是一个强大的任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。结合Spring框架,可以方便地在企业级应用中实现复杂的时间触发逻辑。本实例提供了可以直接运行的任务调度解决方案,既...
基于Spring Boot的Quartz任务调度系统 项目概述 本项目是一个基于Spring Boot和Quartz的任务调度系统,旨在提供灵活的任务管理和调度功能。系统支持多种任务类型,包括Cron表达式任务和单次时间任务,并提供了丰富...
标题“Spring quartz任务调度”指的是在Java开发中利用Spring框架集成Quartz库来实现应用程序的任务调度功能。Quartz是一款开源的作业调度框架,它允许开发者安排任务在特定时间执行,而Spring框架则提供了与Quartz...
Quartz 提供了一套丰富的 API 和支持,可以方便地与 Spring 框架集成,实现灵活的定时任务调度。 在 Spring 中集成 Quartz,首先需要创建一个 Java 类作为定时任务的执行体,例如 `MyJob` 类。这个类通常包含一个...
Spring 整合任务调度框架 Quartz 在软件开发中,任务调度框架是非常重要的一部分,它可以帮助开发者更好地管理和执行各种任务。在 Java 领域中,Quartz 是一个非常流行的任务调度框架,而 Spring 是一个非常流行的 ...
### Quartz任务调度管理 #### 一、任务调度基础概念 任务调度是指系统按照预先设定的时间规则来自动执行特定任务的功能。这种机制广泛应用于各种场景,例如数据备份、定期检查资源状态、发送邮件通知等。 ##### ...
Spring集成Quartz是一款高效的任务调度框架,用于在Java应用程序中执行计划、周期性的任务。Quartz与Spring的结合,使得我们可以充分利用Spring的依赖注入(DI)和AOP特性,简化了任务调度的复杂性。 首先,Quartz...
这篇博客“Spring下使用Quartz任务调度”将深入探讨如何在Spring环境中集成并使用Quartz进行任务管理。 Quartz是一个开源的作业调度框架,它可以被用来创建、调度和执行任务,支持复杂的调度策略。其核心特性包括可...
在Spring的配置文件(如applicationContext.xml)中,我们需要配置SchedulerFactoryBean来启动Quartz调度器: ```xml <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean...
Spring框架作为Java领域广泛使用的轻量级框架,提供了与第三方库Quartz的整合,使得开发者能够轻松地在Spring应用中实现复杂的定时任务调度。Quartz是一款开源的作业调度框架,支持丰富的调度策略,可以满足各种定时...
【Quartz任务调度集群】是Java开发中解决定时任务需求的一种高效方案,它由OpenSymphony团队开发,自2001年以来广泛应用于各种项目。Quartz的核心优势在于其灵活性和简单性,允许开发者自由定义任务触发的时间表,...
Spring Quartz 是一个强大的开源任务调度框架,它允许开发者在Java应用程序中定义和执行定时任务。在Spring框架中集成Quartz,可以充分利用Spring的IoC(Inversion of Control)和AOP(Aspect Oriented Programming...