好得很程序员自学网

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

使用spring-task定时任务动态配置修改执行时间

spring-task定时任务动态配置修改执行时间

因项目需要,几个定时任务需要人为动态设置执行时间,于是乎吧,就查阅相关资料,是可以动态设置的,废话不多说,直接上代码,一目了然。

?

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

package com.seckill.quartz;

import org.springframework.scheduling.Trigger;

import org.springframework.scheduling.TriggerContext;

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 org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

import java.util.Date;

 

/**

  * Created by loup on 2017/11/11.

  */

@Component

@EnableScheduling

public class DynamicScheduledTask implements SchedulingConfigurer {

     //时间表达式  每2秒执行一次

     private String cron = "0/2 * * * * ?" ;

     private SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );

 

     @Override

     public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

         scheduledTaskRegistrar.addTriggerTask( new Runnable() {

             @Override

             public void run() {

                 //任务逻辑

                 System.out.println( "---------------start-------------------" );

                 System.out.println( "动态修改定时任务参数,时间表达式cron为:" + cron);

                 System.out.println( "当前时间为:" + sdf.format( new Date()));

                 System.out.println( "----------------end--------------------" );

             }

         }, new Trigger() {

             @Override

             public Date nextExecutionTime(TriggerContext triggerContext) {

                 CronTrigger cronTrigger = new CronTrigger(cron);

                 Date nextExecDate = cronTrigger.nextExecutionTime(triggerContext);

                 return nextExecDate;

             }

         });

     }

 

     public void setCron(String cron) {

         this .cron = cron;

     }

}

这个是定时任务调度执行器,采用的是注解的方式。首先要动态配置,要设置为@EnableScheduling,这是确保能够动态,然后实现SchedulingConfigurer,重写configureTasks方法,接下来就是这个的相关spring配置文件,要引入下面这个task,不然识别不了啊,配置文件就是这么简单

http://www.springframework.org/schema/task

?

1

2

3

4

5

6

7

8

9

10

11

12

13

<? 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:task = "http://www.springframework.org/schema/task"

        xmlns:context = "http://www.springframework.org/schema/context"

        xsi:schemaLocation="http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans.xsd

         http://www.springframework.org/schema/task

         http://www.springframework.org/schema/task/spring-task.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 

     < context:component-scan base-package = "com.seckill.quartz" />

     < task:annotation-driven />

</ beans >

接下来就是写测试类,测试可不可行啊

?

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

package com.seckill.quartz;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.io.IOException;

 

/**

  * Created by loup on 2017/11/11.

  */

@RunWith (SpringJUnit4ClassRunner. class )

@ContextConfiguration ({ "classpath*:/conf/spring-quartz.xml" })

public class QuartzTest {

 

     @Autowired

     private DynamicScheduledTask dynamicScheduledTask;

 

     @Test

     public void test1(){

         try {

             Thread.sleep( 10000 );

         } catch (InterruptedException e) {

             e.printStackTrace();

         }

         dynamicScheduledTask.setCron( "0/10 * * * * ?" );

         try {

             System.in.read();

         } catch (IOException e) {

             e.printStackTrace();

         }

     }

}

运行测试类,查看结果,达到效果,亲测可用

spring schedule 动态配置执行时间

之前saas平台实现动态修改定时任务的时间,都是通过xx-job这样的框架来实现,这样我们可以单独一个服务来管理我们整个saas平台的定时任务,但是最近给银行做的一个小项目,需要本地化部署,所以我不想弄很多的服务,并且他们并没有要求修改以后即时生效,所以我直接采用了 spring schedule结合mysql动态配置执行时间。

之前我们用的schedule通过注解的方式,只能用静态的corn表达式,如果想实现动态的需要实现SchedulingConfigurer,并且通过注解@EnableScheduling。如下:

?

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

package com.zqf.marketing.task; 

import com.zqf.db.marketingrobot.sys.model.RobotSysSwitch;

import com.zqf.marketing.sys.service.SwitchService;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Lazy;

import org.springframework.scheduling.Trigger;

import org.springframework.scheduling.TriggerContext;

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 org.springframework.stereotype.Service;

import java.util.Date;

 

/**

  * @author zhenghao

  * @description

  * @date 2019/1/22 21:50

  */

 

@Lazy ( false )

@Service

@EnableScheduling

public class TestTaskService implements SchedulingConfigurer {

     private static Logger log = LoggerFactory.getLogger(TestTaskService. class );

     @Autowired

     private SwitchService switchService; 

     private String SpringDynamicCronTask() {

         String cron = "0/5 * * * * ?" ;

         //从数据库获得配置的corn表达式

         RobotSysSwitch switchById = switchService.getSwitchById(5L);

         cron = switchById.getSwitchFlag();

         log.info(cron);

         return cron;

     }

 

     @Override

     public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {

         scheduledTaskRegistrar.addTriggerTask( new Runnable() {

             @Override

             public void run() {

                 // 任务逻辑

                 log.info( "task_task_tak" );

             }

         }, new Trigger() {

             @Override

             public Date nextExecutionTime(TriggerContext triggerContext) {

                 String s = SpringDynamicCronTask();

                 // 任务触发,可修改任务的执行周期

                 CronTrigger trigger = new CronTrigger(s);

                 Date nextExec = trigger.nextExecutionTime(triggerContext);

                 return nextExec;

             }

         }); 

     }

}

这样我们就可以动态的修改task的执行时间,生效时间为,上一个任务的执行周期,也可以满足我们现在需求,这样就可以实习项目更加的灵活!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/ll840768874/article/details/78507286

查看更多关于使用spring-task定时任务动态配置修改执行时间的详细内容...

  阅读:20次