Quartz任务调度2

注意:

不同的版本的jar包,具体的操作不太相同,但是思路是相同的;比如1.8.6jar包中,JobDetail是个类,直接通过构造方法与Job类关联。SimpleTrigger和CornTrigger是类;在2.2.1jar包中,JobDetail是个接口,SimpleTrigger和CornTrigger是接口

mavan工程引入的包:

?


1

2

3

4

5

6

7

8

9

10

11

<!-- 任务调度器相关包 -->

    <dependency>

            <groupId>org.quartz-scheduler</groupId>

            <artifactId>quartz</artifactId>

            <version>2.2.1</version>

        </dependency>

        <dependency>

            <groupId>org.quartz-scheduler</groupId>

            <artifactId>quartz-jobs</artifactId>

            <version>2.2.1</version>

        </dependency>

代码清单1 SimpleJob:简单的Job实现类:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

public class SimpleJob implements Job {

    /**

     * @param context

     * @throws JobExecutionException

     */

    @Override

    public void execute(JobExecutionContext context)

            throws JobExecutionException {

        System.out.println("************哈哈哈********************");

    }

}

这个类用一条非常简单的输出语句实现了Job接口的execute(JobExecutionContext context) 方法,这个方法可以包含想要执行的任何代码。下面,我们通过SimpleTrigger以及CronTrigger对SimpleJob进行调度:

代码清单2 SimpleTriggerRunner:使用SimpleTrigger进行调度

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

import static org.quartz.DateBuilder.evenMinuteDate;

import static org.quartz.JobBuilder.newJob;

import static org.quartz.TriggerBuilder.newTrigger;

import java.util.Date;

import org.quartz.CronScheduleBuilder;

import org.quartz.CronTrigger;

import org.quartz.JobDetail;

import org.quartz.Scheduler;

import org.quartz.SchedulerFactory;

import org.quartz.Trigger;

import org.quartz.TriggerBuilder;

import org.quartz.impl.StdSchedulerFactory;

public class SimpleTriggerRunner {

    public void run() throws Exception {

         // 通过SchedulerFactory获取一个调度器实例  

        SchedulerFactory sf = new StdSchedulerFactory();

        Scheduler sched = sf.getScheduler();

        //创建任务

        JobDetail job = newJob(SimpleJob.class).withIdentity("job1""group1")

                .build();

        //创建触发器每天9点17分触发

        CronTrigger trigger = TriggerBuilder.newTrigger()

                .withIdentity("trigger1""group1")

                .withSchedule(CronScheduleBuilder.cronSchedule("0 17 9 * * ? *"))

                .build();

        //注册调度任务

        sched.scheduleJob(job, trigger);

        /*

        //在现在的时间上加一分钟

        Date runTime = evenMinuteDate(new Date());

        //创建简单的触发器一分钟后触发

        Trigger trigger2 = newTrigger().withIdentity("trigger2", "group1")

                .startAt(runTime)

                .build();

        sched.scheduleJob(job, trigger2);

        */

        //启动任务调度

        sched.start();

        try {

            Thread.sleep(1000);

        }

        catch (Exception e) {

             //调度器停止运行  

            sched.shutdown(true);  

        }

    }

    

    public static void main(String[] args) throws Exception {

        SimpleTriggerRunner example = new SimpleTriggerRunner();

        example.run();

    }

}

Spring中使用任务调度器

一、 说明

spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。至于原因,则是spring对于quartz的支持实现,org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。

我使用的quartz版本是2.2.1 。

最终实现的功能:

1) 项目启动时,可执行的定时任务启动,按时执行相应的逻辑 ;

2)  可添加新任务,删除任务,更新任务,暂停任务,恢复任务 ;

二、 添加quartz包

我使用Maven构建项目,包请见上文mavan中pom.xml

三、 配置及使用

1.  配置任务调度器 (对应的文件名为quartz-task.xml)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 <?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"

 default-lazy-init="false">

 <!-- 调度器 -->

    <bean name="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"

       <!-- 通过applicationContextSchedulerContextKey属性配置spring上下文 -->

        <property name="applicationContextSchedulerContextKey">    

            <value>applicationContext</value>    

        </property>   

    </bean>  

    <!--加载可执行的任务-->

    <bean id="loadTask" class="com.quartz.LoadTask" init-method="initTask" />

 

</beans>

2. 服务器启动时加载,在web.xml文件里配置

?


1

2

3

4

<context-param>

  <param-name>contextConfigLocation</param-name>

  <param-value>classpath:quartz-task.xml</param-value>

 </context-param>

3. 加载可执行任务的类LoadTask.java

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

public class LoadTask {

 public void initTask() throws Exception {

  Scheduler scheduler = schedulerFactoryBean.getScheduler();

  // 可执行的任务列表

  Collection<Task> taskList = taskService.findTask();

  for (Task task : taskList) {

   // 任务名称和任务组设置规则:

   // 名称:task_1 ..

   // 组 :group_1 ..

   TriggerKey triggerKey = TriggerKey.triggerKey(

     "task_" + task.getId(), "group_" + task.getId());

   CronTrigger trigger = (CronTrigger) scheduler

     .getTrigger(triggerKey);

   // 不存在,创建一个

   if (null == trigger) {

    JobDetail jobDetail = JobBuilder

      .newJob(QuartzJobFactory.class)

      .withIdentity("task_" + task.getId(),

        "group_" + task.getId()).build();

    jobDetail.getJobDataMap().put("scheduleJob", task);

    // 表达式调度构建器

    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder

      .cronSchedule(getCronExpression());

    // 按新的表达式构建一个新的trigger

    trigger = TriggerBuilder

      .newTrigger()

      .withIdentity("task_" + task.getId(),

        "group_" + task.getId())

      .withSchedule(scheduleBuilder).build();

    scheduler.scheduleJob(jobDetail, trigger);

   else {

    // trigger已存在,则更新相应的定时设置

    CronScheduleBuilder scheduleBuilder = CronScheduleBuilder

      .cronSchedule(taskService.getCronExpression());

    // 按新的cronExpression表达式重新构建trigger

    trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)

      .withSchedule(scheduleBuilder).build();

    // 按新的trigger重新设置job执行

    scheduler.rescheduleJob(triggerKey, trigger);

   }

  }

 }

 @Autowired

 private SchedulerFactoryBean schedulerFactoryBean;

 @Autowired

 private  TaskService taskService;

}

4. 调度任务的入口

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 public class QuartzTaskFactory implements Job {

  

 @Override

 public void execute(JobExecutionContext context)

   throws JobExecutionException {

  // TODO Auto-generated method stub

  try {

   System.out.println("任务运行...");

   Task task = (Task) context.getMergedJobDataMap().get(

     "scheduleJob");

   System.out.println("任务名称: [" + task.getTaskName() + "]");

   //在这里执行你的任务...

   catch (Exception e) {

   e.printStackTrace();

  }

 }

}

5. 暂停任务

?


1

2

3

Scheduler scheduler = schedulerFactoryBean.getScheduler();

JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());

scheduler.pauseJob(jobKey);

6. 恢复任务

?


1

2

3

Scheduler scheduler = schedulerFactoryBean.getScheduler();

JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());

scheduler.resumeJob(jobKey);

7. 删除任务

?


1

2

3

Scheduler scheduler = schedulerFactoryBean.getScheduler();

JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());

scheduler.deleteJob(jobKey);

8. 立即运行任务

?


1

2

3

Scheduler scheduler = schedulerFactoryBean.getScheduler();

JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName(), scheduleJob.getJobGroup());

scheduler.triggerJob(jobKey);

9. 更新任务(时间表达式)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

Scheduler scheduler = schedulerFactoryBean.getScheduler();

  

TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(),

scheduleJob.getJobGroup());

  

//获取trigger,即在spring配置文件中定义的 bean id="myTrigger"

CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);

  

//表达式调度构建器

CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob

.getCronExpression());

  

//按新的cronExpression表达式重新构建trigger

trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)

.withSchedule(scheduleBuilder).build();

  

//按新的trigger重新设置job执行

scheduler.rescheduleJob(triggerKey, trigger);

四、时间表达式说明

字段 允许值 允许的特殊字符

秒 0-59 , – * /

分 0-59 , – * /

小时 0-23 , – * /

日期 1-31 , – * ? / L W C

月份 1-12 或者 JAN-DEC , – * /

星期 1-7 或者 SUN-SAT , – * ? / L C #

年(可选) 留空, 1970-2099 , – * /

表达式意义

"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触发

每天早上6点

0 6 * * *

每两个小时

0 */2 * * *

晚上11点到早上8点之间每两个小时,早上八点

0 23-7/2,8 * * *

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3

1月1日早上4点

0 4 1 1 *

ok,定时任务已经正确执行....

时间: 2024-08-30 09:03:19

Quartz任务调度2的相关文章

quartz任务调度学习一

1.实现定时任务的几种方式: crontab 命令 + sql语句 python脚本 + sql语句 spring + JDK Timer spring + Quartz 2.Quartz概述: Quartz是java领域中最著名的定时任务调度工具,具有以下特性: 强大的调度功能 灵活的应用方式 负载均衡 高可用特性 易于spring集成 3.基础概念: Quartz 任务调度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任务调度的元数据,

Quartz任务调度实践

最近在写一个任务调度程序,需要每隔几秒查询数据库,并取出数据做一些处理操作.使用到了Quartz任务调度框架. 基本概念 Quartz包含几个重要的对象,分别为任务(Job),触发器(Trigger),调度器(Scheduler) Job:一个接口只有一个方法void execute(),我们需要执行的任务就需要实现这个接口,在execute中实现我们要做的事情. JobDetail:在Quartz执行每次执行Job时,都需要创建一个Job实例,所以它直接接受一个实现类以便运行时实例化,还需要一

Quartz任务调度快速入门

Quartz任务调度快速入门 概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述: ●Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息.Job运行时的信息保存在JobDataMap实例中: ●Jo

Quartz任务调度快速入门(转)

概述 了解Quartz体系结构 Quartz对任务调度的领域问题进行了高度的抽象,提出了调度器.任务和触发器这3个核心的概念,并在org.quartz通过接口和类对重要的这些核心概念进行描述: ●Job:是一个接口,只有一个方法void execute(JobExecutionContext context),开发者实现该接口定义运行任务,JobExecutionContext类提供了调度上下文的各种信息.Job运行时的信息保存在 JobDataMap实例中: ●JobDetail:Quartz

quartz任务调度初次使用记录

近期公司开发的数据交换系统嵌入了quartz任务调度功能,大概了解了任务调度的整个流程,项目中需要用到它来进行定时任务操作,对数据定时检查以及及时交换. Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序.Jobs可以做成标准的Java组件或 EJBs.Quartz的最新版本为Quartz 2.2.1. 任务调度

配置quartz任务调度框架

<properties> <quartz.version>2.2.2</quartz.version> </properties> <dependencyManagement> <dependencies> <!-- quartz任务调度框架 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId&g

quartz任务调度配置 解决jobDetail身份标识存在问题

applicationContext.xml配置:每五秒轮询一次.注意:周和日期不能同时为通配符”*“ 1 <bean id="planInfoServiceImpl" class="com.xxx.xxx"></bean> 2 <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailF

Quartz任务调度器

背景:              近期项目中遇到跨区调拨商品的需求,比如A区和B区,需要判断A区或者B区某种sku是否需要从对方库调拨商品来补充货源,避免因缺失商品而出现订单延误,影响销售和对用户产生不良影响. 问题:             数据量庞大,如果当查看的时候去获取数据,那么会严重影响系统的性能,甚至导致数据库和应用服务器无法响应. 解决方案:            规定在某个时间点,最好是在晚上12点时系统自动获取需要调拨的数据,然后将数据存储到数据库中.晚上12点,用户访问量和系

Quartz任务调度

注意: 不同的版本的jar包,具体的操作不太相同,但是思路是相同的:比如1.8.6jar包中,JobDetail是个类,直接通过构造方法与Job类关联.SimpleTrigger和CornTrigger是类:在2.2.1jar包中,JobDetail是个接口,SimpleTrigger和CornTrigger是接口 mavan工程引入的包: <!-- 任务调度器相关包 --> <dependency>             <groupId>org.quartz-sc