1.在Spring中经常会用到定时任务,一般会在业务方法上使用@Schedule(cron="定时执行规则"),无法实现从前台动态设置定时任务。

在java中固定频率的任务使用ScheduleExecutorService对象来执行,ScheduleAtFixedRate固定频率执行任务和scheduleWithFixedDelay固定延迟后执行任务。

private static SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    public static void main(String[] args){

     ScheduledExecutorService  scheduleTask= Executors.newScheduledThreadPool(1);

     ScheduledFuture<?> scheduledFuture = scheduleTask.scheduleAtFixedRate(() -> {

      System.out.println("每隔10秒执行一次"+dateFormat.format(new Date()));

     }, 0, 10, TimeUnit.SECONDS);

     scheduleTask.schedule(() -> {

      System.out.println(dateFormat.format(new Date())+"取消定时执行任务");
scheduledFuture.cancel(true); },60,TimeUnit.SECONDS); }

在固定频率,每隔10秒执行一次,1分钟后取消任务。

执行结果见下:

在Spring-context中,提供丰富化的ThreadPoolScheduleTask对象和Trigger触发器,可以很方便地设置任务的执行时间。

在trigger中会根据Cron将下一次执行时间,在此次执行后设置,所以如果要动态改变执行时间,需要先取消任务(清空任务BlockQueue)。

根据上次执行时间和cron设置TriggerContext中的执行时间,保证设置与执行的同步一致性。

代码见下:

@Component
public class DynamicScheduledTask { @Autowired
private ThreadPoolTaskScheduler taskScheduler; private ScheduledFuture future; private static SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); private String cron = ""; public void setCron(final String cron) {
this.cron = cron;
stopScheduleTask(); future=taskScheduler.schedule(new Runnable() {
@Override
public void run() {
// 定时任务的业务逻辑
System.out.println("动态修改定时任务cron参数,当前时间:" + dateFormat.format(new Date()));
}
}, new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
// 定时任务触发,可修改定时任务的执行周期
if ("".equals(cron) || cron == null)
return null;
CronTrigger trigger = new CronTrigger(cron);
Date nextExecDate =trigger.nextExecutionTime(triggerContext);
return nextExecDate;
}}); } public void stopScheduleTask(){ if(future !=null) {
future.cancel(true);
}
} }

在这种回调中执行业务任务的方法中,可以看出java的缺陷,并不能将方法作为参数进行传递。在最古老的lisp中宏就可以方法也是一种数据。

在java 1.8中出现函数式编程,用JDK的ScheduleExecutorService使用了函数式,对比发现其实差别并不是很大,只是一种简化。

Spring设置动态定时任务的更多相关文章

  1. Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).      这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户 ...

  2. quartz spring 实现动态定时任务

    在实际项目应用中经常会用到定时任务,可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间.频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quar ...

  3. springboot动态定时任务

    SpringBoot设置动态定时任务 一.说明 1.在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置. 2.定时任务执行时间可根据数据库中某个设置字段动 ...

  4. Quartz在Spring中动态设置cronExpression

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

  5. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

  6. spring boot 整合 quartz 集群环境 实现 动态定时任务配置【原】

    最近做了一个spring boot 整合 quartz  实现 动态定时任务配置,在集群环境下运行的 任务.能够对定时任务,动态的进行增删改查,界面效果图如下: 1. 在项目中引入jar 2. 将需要 ...

  7. Spring Boot 创建定时任务(配合数据库动态执行)

    序言:创建定时任务非常简单,主要有两种创建方式:一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库 ...

  8. Spring实现动态数据源,支持动态加入、删除和设置权重及读写分离

    当项目慢慢变大,訪问量也慢慢变大的时候.就难免的要使用多个数据源和设置读写分离了. 在开题之前先说明下,由于项目多是使用Spring,因此下面说到某些操作可能会依赖于Spring. 在我经历过的项目中 ...

  9. SpringBoot中并发定时任务的实现、动态定时任务的实现(看这一篇就够了)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10659045.html,否则将追究法律责任!!! 一.在JAVA开发领域,目前可以通过以下 ...

随机推荐

  1. Java可视操作界面例子

    package rom; import java.lang.*; import java.awt.*; import java.awt.event.ActionEvent; import java.a ...

  2. 使用tpcc-mysql进行性能测试

    tpcc-mysql的github地址:https://github.com/Percona-Lab/tpcc-mysql tpcc-mysql源代码进行编译,服务器上需要安装有mysql git c ...

  3. 6.简单提取小红书app数据(简单初步试采集与分析)-1

    采集小红书数据爬虫:1.本来是要通过app端的接口去直接采集数据,但是app接口手机端设置本地代理这边开启抓包后就不能正常访问数据.所以就采用了微信小程序里的小红书app接口去采集数据. 2.通过 f ...

  4. 57.2拓展之纯 CSS 创作黑暗中会动的眼睛和嘴巴

    效果地址:https://scrimba.com/c/cbNkBnuV HTML code: <!-- 定义dom, .eyes容器中包含2个元素 --> <div class=&q ...

  5. if、else、elif

    if后面+判断条件 elif后面+判断条件 else 否则进行某些操作 举个列子 1 a = raw_input(">>>") 2 if a == "h ...

  6. python 生成器 的send

    >>> def f(): c=yield 5 print c d=yield c+5 print d >>> b=f() >>> b.send(N ...

  7. ubuntu 上 SSH scp 技巧

    参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议,为 ...

  8. ASPxLoadingPanel(珍藏版)

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ASPxLoadingPanel ...

  9. vue父子组件嵌套的时候遇到 - Component template should contain exactly one root element. If you are using v-i

    转自:https://blog.csdn.net/yangyiboshigou/article/details/72084619

  10. NetBeans 8以后版本无法连接git服务器

    因为目前的git服务器的密钥加密基本都是256位的,而NetBeans带的jre环境的加密限制在基本的128位加密,从而导致无法和git服务器通信 解决办法 下载Java Cryptography E ...