好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

spring boot task实现动态创建定时任务的方法

在spring boot项目中,通过@enablescheduling可启用spring自带的定时任务支持,在通过@scheduled注解定义定时任务,但是通过注解只能编写固定时间的定时任务,无法动态调整定时间隔,可通过实现schedulingconfigurer接口实现动态定时任务注册。

对比quartz的优缺点

优点:配置非常简单
缺点:

不支持分布式部署 不支持动态配置定时任务 不支持持久化

其实这几个缺点归根结底都是因为不支持持久化,所以如果项目需要持久化定时任务,还是要选择quartz比较好。

参考代码:

?

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

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

package org.cent.demo.scanner.schedule;

 

import lombok.allargsconstructor;

import lombok.data;

import lombok.extern.slf4j.slf4j;

import org.springframework.context.annotation.configuration;

import org.springframework.scheduling.trigger;

import org.springframework.scheduling.annotation.enablescheduling;

import org.springframework.scheduling.annotation.schedulingconfigurer;

import org.springframework.scheduling.config.scheduledtaskregistrar;

import org.springframework.scheduling.support.crontrigger;

 

import java.util.arrays;

import java.util.list;

 

/**

  * @author: cent

  * @email: 292462859@qq测试数据

  * @date: 2019/1/16.

  * @description:

  */

@configuration

@enablescheduling

@slf4j

public class dynamicschedule implements schedulingconfigurer {

 

  /**

  * 测试数据,实际可从数据库获取

  */

  private list<task> tasks = arrays.aslist(

   new task( 1 , "任务1" , "*/30 * * * * *" ),

   new task( 2 , "任务2" , "*/30 * * * * *" ),

   new task( 3 , "任务3" , "*/30 * * * * *" ),

   new task( 4 , "任务4" , "*/30 * * * * *" ),

   new task( 5 , "任务5" , "*/30 * * * * *" ),

   new task( 6 , "任务6" , "*/30 * * * * *" ),

   new task( 7 , "任务7" , "*/30 * * * * *" ),

   new task( 8 , "任务8" , "*/30 * * * * *" ),

   new task( 9 , "任务9" , "*/30 * * * * *" ),

   new task( 10 , "任务10" , "*/30 * * * * *" )

  );

 

  @override

  public void configuretasks(scheduledtaskregistrar scheduledtaskregistrar) {

  tasks.foreach(task -> {

   //任务执行线程

   runnable runnable = () -> log.info( "execute task {}" , task.getid());

 

   //任务触发器

   trigger trigger = triggercontext -> {

   //获取定时触发器,这里可以每次从数据库获取最新记录,更新触发器,实现定时间隔的动态调整

   crontrigger crontrigger = new crontrigger(task.getcron());

   return crontrigger.nextexecutiontime(triggercontext);

   };

 

   //注册任务

   scheduledtaskregistrar.addtriggertask(runnable, trigger);

  });

 

  }

 

  @data

  @allargsconstructor

  static class task {

  /**

   * 主键id

   */

  private int id;

  /**

   * 任务名称

   */

  private string name;

  /**

   * cron表达式

   */

  private string cron;

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://HdhCmsTestjianshu测试数据/p/546631cc2b8f

查看更多关于spring boot task实现动态创建定时任务的方法的详细内容...

  阅读:10次