barriers / 阅读 / 详情

运用Executors.newScheduledThreadPool的任务调度怎么解决

2023-07-22 02:01:00
共1条回复
可乐

Timer

相信大家都已经非常熟悉 java.util.Timer 了,它是最简单的一种实现任务调度的方法,下面给出一个具体的例子:

清单 1. 使用 Timer 进行任务调度

package com.ibm.scheduler;

import java.util.Timer;

import java.util.TimerTask;

public class TimerTest extends TimerTask {

private String jobName = "";

public TimerTest(String jobName) {

super();

this.jobName = jobName;

}

@Override

public void run() {

System.out.println("execute " + jobName);

}

public static void main(String[] args) {

Timer timer = new Timer();

long delay1 = 1 * 1000;

long period1 = 1000;

// 从现在开始 1 秒钟之后,每隔 1 秒钟执行一次 job1

timer.schedule(new TimerTest("job1"), delay1, period1);

long delay2 = 2 * 1000;

long period2 = 2000;

// 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 job2

timer.schedule(new TimerTest("job2"), delay2, period2);

}

}

Output:

execute job1

execute job1

execute job2

execute job1

execute job1

execute job2

使用 Timer 实现任务调度的核心类是 Timer 和 TimerTask。其中 Timer 负责设定 TimerTask 的起始与间隔执行时间。使用者只需要创建一个 TimerTask 的继承类,实现自己的 run 方法,然后将其丢给 Timer 去执行即可。

Timer 的设计核心是一个 TaskList 和一个 TaskThread。Timer 将接收到的任务丢到自己的 TaskList 中,TaskList 按照 Task 的最初执行时间进行排序。TimerThread 在创建 Timer 时会启动成为一个守护线程。这个线程会轮询所有任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread 被唤醒并执行该任务。之后 TimerThread 更新最近一个要执行的任务,继续休眠。

Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。

回页首

ScheduledExecutor

鉴于 Timer 的上述缺陷,Java 5 推出了基于线程池设计的 ScheduledExecutor。其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。需要注意的是,只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。

清单 2. 使用 ScheduledExecutor 进行任务调度

package com.ibm.scheduler;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class ScheduledExecutorTest implements Runnable {

private String jobName = "";

public ScheduledExecutorTest(String jobName) {

super();

this.jobName = jobName;

}

@Override

public void run() {

System.out.println("execute " + jobName);

}

public static void main(String[] args) {

ScheduledExecutorService service = Executors.newScheduledThreadPool(10);

long initialDelay1 = 1;

long period1 = 1;

// 从现在开始1秒钟之后,每隔1秒钟执行一次job1

service.scheduleAtFixedRate(

new ScheduledExecutorTest("job1"), initialDelay1,

period1, TimeUnit.SECONDS);

long initialDelay2 = 1;

long delay2 = 1;

// 从现在开始2秒钟之后,每隔2秒钟执行一次job2

service.scheduleWithFixedDelay(

new ScheduledExecutorTest("job2"), initialDelay2,

delay2, TimeUnit.SECONDS);

}

}

Output:

execute job1

execute job1

execute job2

execute job1

execute job1

execute job2

清单 2 展示了 ScheduledExecutorService 中两种最常用的调度方法 ScheduleAtFixedRate 和 ScheduleWithFixedDelay。ScheduleAtFixedRate 每次执行时间为上一次任务开始起向后推一个时间间隔,即每次执行时间为 :initialDelay, initialDelay+period, initialDelay+2*period, …;ScheduleWithFixedDelay 每次执行时间为上一次任务结束起向后推一个时间间隔,即每次执行时间为:initialDelay, initialDelay+executeTime+delay, initialDelay+2*executeTime+2*delay。由此可见,ScheduleAtFixedRate 是基于固定时间间隔进行任务调度,ScheduleWithFixedDelay 取决于每次任务执行的时间长短,是基于不固定时间间隔进行任务调度。

回页首

用 ScheduledExecutor 和 Calendar 实现复杂任务调度

Timer 和 ScheduledExecutor 都仅能提供基于开始时间与重复间隔的任务调度,不能胜任更加复杂的调度需求。比如,设置每星期二的 16:38:10 执行任务。该功能使用 Timer 和 ScheduledExecutor 都不能直接实现,但我们可以借助 Calendar 间接实现该功能。

清单 3. 使用 ScheduledExcetuor 和 Calendar 进行任务调度

package com.ibm.scheduler;

import java.util.Calendar;

import java.util.Date;

import java.util.TimerTask;

import java.util.concurrent.Executors;

import java.util.concurrent.ScheduledExecutorService;

import java.util.concurrent.TimeUnit;

public class ScheduledExceutorTest2 extends TimerTask {

private String jobName = "";

public ScheduledExceutorTest2(String jobName) {

super();

this.jobName = jobName;

}

@Override

public void run() {

System.out.println("Date = "+new Date()+", execute " + jobName);

}

/**

* 计算从当前时间currentDate开始,满足条件dayOfWeek, hourOfDay,

* minuteOfHour, secondOfMinite的最近时间

* @return

*/

public Calendar getEarliestDate(Calendar currentDate, int dayOfWeek,

int hourOfDay, int minuteOfHour, int secondOfMinite) {

//计算当前时间的WEEK_OF_YEAR,DAY_OF_WEEK, HOUR_OF_DAY, MINUTE,SECOND等各个字段值

int currentWeekOfYear = currentDate.get(Calendar.WEEK_OF_YEAR);

int currentDayOfWeek = currentDate.get(Calendar.DAY_OF_WEEK);

int currentHour = currentDate.get(Calendar.HOUR_OF_DAY);

int currentMinute = currentDate.get(Calendar.MINUTE);

int currentSecond = currentDate.get(Calendar.SECOND);

//如果输入条件中的dayOfWeek小于当前日期的dayOfWeek,则WEEK_OF_YEAR需要推迟一周

boolean weekLater = false;

if (dayOfWeek < currentDayOfWeek) {

weekLater = true;

} else if (dayOfWeek == currentDayOfWeek) {

//当输入条件与当前日期的dayOfWeek相等时,如果输入条件中的

//hourOfDay小于当前日期的

//currentHour,则WEEK_OF_YEAR需要推迟一周

if (hourOfDay < currentHour) {

weekLater = true;

} else if (hourOfDay == currentHour) {

//当输入条件与当前日期的dayOfWeek, hourOfDay相等时,

//如果输入条件中的minuteOfHour小于当前日期的

//currentMinute,则WEEK_OF_YEAR需要推迟一周

if (minuteOfHour < currentMinute) {

weekLater = true;

} else if (minuteOfHour == currentSecond) {

//当输入条件与当前日期的dayOfWeek, hourOfDay,

//minuteOfHour相等时,如果输入条件中的

//secondOfMinite小于当前日期的currentSecond,

//则WEEK_OF_YEAR需要推迟一周

if (secondOfMinite < currentSecond) {

weekLater = true;

}

}

}

}

if (weekLater) {

//设置当前日期中的WEEK_OF_YEAR为当前周推迟一周

currentDate.set(Calendar.WEEK_OF_YEAR, currentWeekOfYear + 1);

}

// 设置当前日期中的DAY_OF_WEEK,HOUR_OF_DAY,MINUTE,SECOND为输入条件中的值。

currentDate.set(Calendar.DAY_OF_WEEK, dayOfWeek);

currentDate.set(Calendar.HOUR_OF_DAY, hourOfDay);

currentDate.set(Calendar.MINUTE, minuteOfHour);

currentDate.set(Calendar.SECOND, secondOfMinite);

return currentDate;

}

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

ScheduledExceutorTest2 test = new ScheduledExceutorTest2("job1");

//获取当前时间

Calendar currentDate = Calendar.getInstance();

long currentDateLong = currentDate.getTime().getTime();

System.out.println("Current Date = " + currentDate.getTime().toString());

//计算满足条件的最近一次执行时间

Calendar earliestDate = test

.getEarliestDate(currentDate, 3, 16, 38, 10);

long earliestDateLong = earliestDate.getTime().getTime();

System.out.println("Earliest Date = "

+ earliestDate.getTime().toString());

//计算从当前时间到最近一次执行时间的时间间隔

long delay = earliestDateLong - currentDateLong;

//计算执行周期为一星期

long period = 7 * 24 * 60 * 60 * 1000;

ScheduledExecutorService service = Executors.newScheduledThreadPool(10);

//从现在开始delay毫秒之后,每隔一星期执行一次job1

service.scheduleAtFixedRate(test, delay, period,

TimeUnit.MILLISECONDS);

}

}

Output:

Current Date = Wed Feb 02 17:32:01 CST 2011

Earliest Date = Tue Feb 8 16:38:10 CST 2011

Date = Tue Feb 8 16:38:10 CST 2011, execute job1

Date = Tue Feb 15 16:38:10 CST 2011, execute job1

相关推荐

scheduled怎么读

1、英音[_edju:ld]美音[sked__ld]2、scheduled,英语单词,主要用作形容词、动词,作形容词时译为“预定的;已排程的”,作动词时译为“安排(schedule的过去分词);把?列表;把?列入计划”。3、Thenextoneisscheduledforoctober,andyoucanbetnebulawillbethere.下一次峰会计划于今年10月举行,我敢打赌Nebula届时一定会出席。4、Anotherbricauctionisscheduledfornextaprilinlondon.另一场拍卖会计划明年四月在伦敦举行。5、Percocowasscheduledtodiscussitduringatalkonsaturday.percoco计划在周六的一次会谈中讨论它。
2023-07-21 19:55:041

@Scheduled注解各参数详解

@Scheduled 由Spring定义,用于将方法设置为调度任务。如:方法每隔十秒钟被执行、方法在固定时间点被执行等 @Scheduled(fixedDelay = 1000) 上一个任务结束到下一个任务开始的时间间隔为固定的1秒,任务的执行总是要先等到上一个任务的执行结束 @Scheduled(fixedRate = 1000) 每间隔1秒钟就会执行任务(如果任务执行的时间超过1秒,则下一个任务在上一个任务结束之后立即执行) @Scheduled(fixedDelay = 1000, initialDelay = 2000) 第一次执行的任务将会延迟2秒钟后才会启动 @Scheduled(cron = “0 15 10 15 * ?”) Cron表达式,每个月的15号上午10点15开始执行任务 在配置文件中配置任务调度的参数
2023-07-21 19:55:461

scheduled 怎么读呀?

可以读成:[ˈskedʒu:ld], 或者 [ˈskedʒu:əld], 和 [ˈskedʒəld]意思是事先安排好的,预定的 - 形容词当然,也可以作为动词,是被列入计划的意思。因为 schedule 本身是解作列出进度、列入计划等等的意思。希望帮到你。
2023-07-21 19:55:531

scheduledexecutorservice怎么读

英文原文:schedule dexecutor service英式音标:[u02c8u0283edjuu02d0l; u02c8sked-] dexecutor [u02c8su025cu02d0vu026as] 美式音标:[u02c8sku025bdu0292ul] dexecutor [u02c8su025dvu026as]
2023-07-21 19:56:011

scheduled的副词是什么

直接加ly后缀
2023-07-21 19:56:092

spring的@scheduled定时怎么加返回值

首先要配置我们的spring.xmlxmlns 多加下面的内容、然后xsi:schemaLocation多加下面的内容、最后是我们的task任务扫描注解[html] view plaincopy<task:annotation-driven/> 我的配置扫描位置是:[html] view plaincopy<context:annotation-config/><bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/><context:component-scan base-package="com.test"/> 扫描的是com.test这样的包下的内容、下面需要接口和实现(我的这几个java文件都是com.test的包下的、)[java] view plaincopypublic interface IMyTestService {public void myTest(); } [java] view plaincopy@Component //import org.springframework.stereotype.Component; public class MyTestServiceImpl implements IMyTestService {@Scheduled(cron="0/5 * * * * ? ") //每5秒执行一次@Overridepublic void myTest(){System.out.println("进入测试");} } 执行后控制台就会打印出 进入测试 了需要注意的几点:1、spring的@Scheduled注解 需要写在实现上、2、 定时器的任务方法不能有返回值(如果有返回值,spring初始化的时候会告诉你有个错误、需要设定一个proxytargetclass的某个值为true、具体就去百度google吧)3、实现类上要有组件的注解@Component
2023-07-21 19:56:191

美国签证网上预约结果查询看不懂哪 请教高人。 我的B1签证状态显示scheduled是什么意思?

就是已经预约过了
2023-07-21 19:56:412

@Scheduled(cron = "0/5 * * * * *")将时间改为配置

有两种方法:第一种当然你可以把Scheduled写到xml文件中进行配置。第二种在你的类前面添加@PropertySource("classpath:root/test.props")然后修改你的@Scheduled(cron="0/5 * * * * ? ") 为 @Scheduled(cron="${jobs.schedule}") 最后test.props 添加 jobs.schedule = 0/5 * * * * ?
2023-07-21 19:56:481

Spring使用@Scheduled进行定时任务,定的时间可否变

定时任务的实现方式有多种,例如JDK自带的Timer+TimerTask方式,Spring 3.0以后的调度任务(Scheduled Task),Quartz等。Timer+TimerTask是最基本的解决方案,但是比较远古了,这里不再讨论。Spring自带的ScheduledTask是一个轻量级的定时任务调度器,支持固定时间(支持cron表达式)和固定时间间隔调度任务,支持线程池管理。以上两种方式有一个共同的缺点,那就是应用服务器集群下会出现任务多次被调度执行的情况,因为集群的节点之间是不会共享任务信息的,每个节点上的任务都会按时执行。Quartz是一个功能完善的任务调度框架,特别牛叉的是它支持集群环境下的任务调度,当然代价也很大,需要将任务调度状态序列化到数据库。Quartz框架需要10多张表协同,配置繁多,令人望而却步...经过折中考虑,还是选择了Spring的Scheduled Task来实现定时任务。如下:1. Spring配置文件application-context.xml中添加task命名空间和描述。[html] view plain copy<beans xmlns="" xmlns:task="" xsi:schemaLocation=" /spring-beans.xsd /spring-task.xsd"> 2. 添加调度器和线程池声明。[html] view plain copy<task:executor id="taskExecutor" pool-size="10" /> <task:annotation-driven executor="taskExecutor" /> 3. 实现调度方法。基本结构如下:[html] view plain copypackage com.netease.yx.service; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @Service public class ScheduledService { @Scheduled(cron = "0 0 5 * * *") public void build() { System.out.println("Scheduled Task"); } } @Scheduled注解支持秒级的cron表达式,上述声明表示每天5点执行build任务。前文已经提过,这种方式在单台应用服务器上运行没有问题,但是在集群环境下,会造成build任务在5点的时候运行多次,遗憾的是,Scheduled Task在框架层面没有相应的解决方案,只能靠程序员在应用级别进行控制。如何控制看1. 无非是一个任务互斥访问的问题,声明一把全局的逗锁地作为互斥量,哪个应用服务器拿到这把逗锁地,就有执行任务的权利,未拿到逗锁地的应用服务器不进行任何任务相关的操作。2.这把逗锁地最好还能在下次任务执行时间点前失效。在项目中我将这个互斥量放在了redis缓存里,1小时过期,这个过期时间是由任务调度的间隔时间决定的,只要小于两次任务执行时间差,大于集群间应用服务器的时间差即可。完整定时任务类如下:[html] view plain copypackage com.netease.yx.service; import javax.annotation.Resource; import org.apache.commons.lang3.time.DateUtils; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.netease.yx.service.ICacheService; @Service public class ScheduledService { @Resource private ICacheService cache = null; private static String CACHE_LOCK = "cache_lock"; private static int EXPIRE_PERIOD = (int)DateUtils.MILLIS_PER_HOUR / 1000; @Scheduled(cron = "0 0 5 * * *") public void build() { if (cache.get(CACHE_LOCK) == null) { cache.set(CACHE_LOCK, true, EXPIRE_PERIOD); doJob(); } } }
2023-07-21 19:56:561

scheduled怎么配置有返回值的方法

显示器设置在5--15分钟关闭 硬盘和待机选择从不 我是这样设置的 如果有在线的应用程序在运行,关闭硬盘和待机会使数据丢失
2023-07-21 19:57:053

怎么设置scheduledexecutorservice的优先级

scheduleAtFixedRateScheduledFuturescheduleAtFixedRate(Runnablecommand,longinitialDelay,longperiod,TimeUnitunit)创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在initialDelay后开始执
2023-07-21 19:57:152

Spring使用@Scheduled注解配置定时任务

项目中经常会用到定时任务。所以在这里总结一下在SSM框架中如何配置定时任务。 1、在spring的配置文件spring.xml(文件名可以任意)中增加如下配置 1):spring配置文件加入头部加入 2):spring配置文件加入定时任务注解配置 3):spring配置文件加入定时任务扫描包 4):spring配置文件加入配置定时任务的线程池。因为spring的定时任务默认是单线程,多个任务执行起来时间会有问题。 2、在package com.sc.api下新增定时任务相关类ScheduledApiTest 调用的两种方式: @Scheduled注解为定时任务,@Component 把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/> 1):如果需要以固定速率执行,只要将注解中指定的属性名称改成fixedRate即可,以下方法将以一个固定速率1分钟来调用一次执行,这个周期是以上一个任务开始时间为基准,从上一任务开始执行后1分钟再次调用。 @Scheduled(fixedRate = 1000 60 30) //心跳更新。启动时执行一次,之后每隔1分钟执行一次 2):如果你需要在特定的时间执行,就需要用到cron,cron表达式里为执行的时机 @Scheduled(cron = "0 34 13 * * ?") //每天的13点30分执行一次。 3、启动tomcat服务,定时任务就会按时执行。 关于CRON表达式 含义
2023-07-21 19:57:221

怎么停止scheduledexecutorservice 定时任务

用 ScheduledExecutorService.shutdownNow() shutdown() 方法 还会把后续任务都执行完毕才关闭。
2023-07-21 19:57:291

玩转SpringBoot之定时任务@Scheduled线程池配置-

对于定时任务,在SpringBoot中只需要使用@Scheduled 这个注解就能够满足需求,它的出现也给我们带了很大的方便,我们只要加上该注解,并且根据需求设置好就可以使用定时任务了。 但是,我们需要注意的是, @Scheduled 并不一定会按时执行 。 因为使用@Scheduled 的定时任务虽然是 异步执行 的,但是,不同的定时任务之间 并不是并行 的!!!!!!!! 在其中一个定时任务没有执行完之前,其他的定时任务即使是到了执行时间,也是不会执行的,它们会进行排队。 也就是如果你想你不同的定时任务互不影响,到时间就会执行,那么你最好将你的定时任务方法自己搞成异步方法,这样,定时任务其实就相当于调用了一个线程执行任务,一瞬间就结束了。比如使用: @Async 当然,也可以勉强将你的定时任务当做都会定时执行。但是,作为一个合格的程序员 那么,如何将@Scheduled实现的定时任务变成异步的呢?此时你需要对@Scheduled进行线程池配置。 回到顶部 附带介绍一下线程池的几个参数。需要彻底搞懂,不要死记硬背哦! 回到顶部 回到顶部 上个流程图,先试着自己看下能不能看懂: 本文转自https://www.cnblogs.com/mmzs/p/16057742.html
2023-07-21 19:57:491

分布式定时任务调度框架实践

分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。 一、业务背景 1.1 为什么需要使用定时任务调度 (1)时间驱动处理场景: 整点发送优惠券,每天更新收益,每天刷新标签数据和人群数据。 (2)批量处理数据: 按月批量统计报表数据,批量更新短信状态,实时性要求不高。 (3)异步执行解耦: 活动状态刷新,异步执行离线查询,与内部逻辑解耦。 1.2 使用需求和痛点 (1)任务执行监控告警能力。 (2)任务可灵活动态配置,无需重启。 (3)业务透明,低耦合,配置精简,开发方便。 (4)易测试。 (5)高可用,无单点故障。 (6)任务不可重复执行,防止逻辑异常。 (7)大任务的分发并行处理能力。 二、开源框架实践与 探索 2.1 Java 原生 Timer 和 ScheduledExecutorService 2.1.1 Timer使用 Timer缺陷: 由于上述缺陷,尽量不要使用Timer, idea中也会明确提示,使用ScheduledThreadPoolExecutor替代Timer 。 2.1.2 ScheduledExecutorService使用 ScheduledExecutorService对于Timer的缺陷进行了修补,首先ScheduledExecutorService内部实现是ScheduledThreadPool线程池,可以支持多个任务并发执行。 对于某一个线程执行的任务出现异常,也会处理,不会影响其他线程任务的执行,另外ScheduledExecutorService是基于时间间隔的延迟,执行不会由于系统时间的改变发生变化。 当然,ScheduledExecutorService也有自己的局限性:只能根据任务的延迟来进行调度,无法满足基于绝对时间和日历调度的需求。 2.2 Spring Task 2.2.1 Spring Task 使用 spring task 是spring自主开发的轻量级定时任务框架,不需要依赖其他额外的包,配置较为简单。 此处使用注解配置 2.2.2 Spring Task缺陷 Spring Task 本身不支持持久化,也没有推出官方的分布式集群模式,只能靠开发者在业务应用中自己手动扩展实现,无法满足可视化,易配置的需求。 2.3 永远经典的 Quartz 2.3.1 基本介绍 Quartz框架是Java领域最著名的开源任务调度工具,也是目前事实上的定时任务标准,几乎全部的开源定时任务框架都是基于Quartz核心调度构建而成。 2.3.2 原理解析 核心组件和架构 关键概念 (1) Scheduler :任务调度器,是执行任务调度的控制器。本质上是一个计划调度容器,注册了全部Trigger和对应的JobDetail, 使用线程池作为任务运行的基础组件,提高任务执行效率。 (2) Trigger :触发器,用于定义任务调度的时间规则,告诉任务调度器什么时候触发任务,其中CronTrigger是基于cron表达式构建的功能强大的触发器。 (3) Calendar :日历特定时间点的集合。一个trigger可以包含多个Calendar,可用于排除或包含某些时间点。 (4) JobDetail :是一个可执行的工作,用来描述Job实现类及其它相关的静态信息,如Job的名称、监听器等相关信息。 (5) Job :任务执行接口,只有一个execute方法,用于执行真正的业务逻辑。 (6) JobStore :任务存储方式,主要有RAMJobStore和JDBCJobStore,RAMJobStore是存储在JVM的内存中,有丢失和数量受限的风险,JDBCJobStore是将任务信息持久化到数据库中,支持集群。 2.3.3 实践说明 (1)关于Quartz的基本使用 (2)业务使用要满足动态修改和重启不丢失, 一般需要使用数据库进行保存。 (3)组件化 (4)扩展 2.3.4 缺陷和不足 (1)需要把任务信息持久化到业务数据表,和业务有耦合。 (2)调度逻辑和执行逻辑并存于同一个项目中,在机器性能固定的情况下,业务和调度之间不可避免地会相互影响。 (3)quartz集群模式下,是通过数据库独占锁来唯一获取任务,任务执行并没有实现完善的负载均衡机制。 2.4 轻量级神器 XXL-JOB 2.4.1 基本介绍 XXL-JOB是一个轻量级分布式任务调度平台,主打特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展,代码仍在持续更新中。 主要提供了任务的动态配置管理、任务监控和统计报表以及调度日志几大功能模块,支持多种运行模式和路由策略,可基于对应执行器机器集群数量进行简单分片数据处理。 2.4.2 原理解析 2.1.0版本前核心调度模块都是基于quartz框架,2.1.0版本开始自研调度组件,移除quartz依赖 ,使用时间轮调度。 2.4.3 实践说明 详细配置和介绍参考官方文档。 2.4.3.1 demo使用: @JobHandler(value="offlineTaskJobHandler") ,实现业务逻辑即可。(注:此次引入了dubbo,后文介绍)。 (滑动可查看) 示例2:分片广播任务。 (滑动可查看) 2.4.3.2 整合dubbo (1)引入dubbo-spring-boot-starter和业务facade jar包依赖。 (滑动可查看) (2)配置文件加入dubbo消费端配置(可根据环境定义多个配置文件,通过profile切换)。 (滑动可查看) (3)代码中通过@Reference注入facade接口即可。 (滑动可查看) (4)启动程序加入@EnableDubboConfiguration注解。 (滑动可查看) 2.4.4 任务可视化配置 内置了平台项目,方便了开发者对任务的管理和执行日志的监控,并提供了一些便于测试的功能。 2.4.5 扩展 (1)任务监控和报表的优化。 (2)任务报警方式的扩展,比如加入告警中心,提供内部消息,短信告警。 (3)对实际业务内部执行出现异常情况下的不同监控告警和重试策略。 2.5 高可用 Elastic-Job 2.5.1 基本介绍 Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。 Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。 Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。 可惜的是已经两年没有迭代更新记录。 2.5.2 原理解析 2.5.3 实践说明 2.5.3.1 demo使用 (1)安装zookeeper,配置注册中心config,配置文件加入注册中心zk的配置。 (滑动可查看) (滑动可查看) (2)配置数据源config,并配置文件中加入数据源配置。 (滑动可查看) (滑动可查看) (3)配置事件config。 (滑动可查看) (4)为了便于灵活配置不同的任务触发事件,加入ElasticSimpleJob注解。 (滑动可查看) (5)对配置进行初始化。 (滑动可查看) (6)实现 SimpleJob接口,按上文中方法整合dubbo, 完成业务逻辑。 (滑动可查看) 2.6 其余开源框架 (1) Saturn :Saturn是唯品会开源的一个分布式任务调度平台,在Elastic Job的基础上进行了改造。 (2) SIA-TASK :是宜信开源的分布式任务调度平台。 三、优劣势对比和业务场景适配思考 业务思考: 四、结语 对于并发场景不是特别高的系统来说,xxl-job配置部署简单易用,不需要引入多余的组件,同时提供了可视化的控制台,使用起来非常友好,是一个比较好的选择。希望直接利用开源分布式框架能力的系统,建议根据自身的情况来进行合适的选型。 附:参考文献 高可用架构 改变互联网的构建方式
2023-07-21 19:57:571

如何按条件移除scheduledexecutorservice线程池中的任务

java中的定时器功能在jdk1.5之前,大家都用传统的定时器Timer来实现该功能如,我们需要定制一个特殊方法,在程序首次载入时就执行,以后每隔一定的时间去执行那个方法传统的做法如下;[html] view plain copy/** * 定时器的测试(传统方式) */ public static void testTimer(){ Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { System.out.println("Timer:测试开始!"); } }; //第一个参数是要执行的任务 //第二个是程序启动后要延迟多长后执行,单位毫秒 //第三个参数是,第一次执行后,以后每隔多长时间后在行 timer.schedule(task, 5000, 3000); } jdk1.5出来后,我们就可以改变这种做法,换种方式如代码:[html] view plain copy/** * 定时器的测试(ScheduledExecutorService) */ public static void testExcuters(){ ScheduledExecutorService service = Executors.newScheduledThreadPool(1); service.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("ScheduledExecutorService:测试开始"); } }, 5, 3,TimeUnit.SECONDS); }
2023-07-21 19:58:051

spring boot scheduled fixeddelay可以动态获取吗

  好像可以。  Scheduled 可以作为一个触发源添加到一个方法中,例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行,这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执行。
2023-07-21 19:58:131

as is scheduled, as scheduled, as it is scheduled 有什么区别

意思没区别,但从句类型有区别,as is scheduled是定语从句,关系代词as代替整个主句内容且在定语从句中做主语(主句可以假想一个). as scheduled其实就是as it is schduled的省略,是方式状语从句。
2023-07-21 19:58:222

@Scheduled注解各参数详解

@Scheduled注解的使用这里不详细说明,直接对8个参数进行讲解。 该参数接收一个 cron表达式 , cron表达式 是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。 每隔5秒执行一次:*/5 * * * * ? 每隔1分钟执行一次:0 */1 * * * ? 每天23点执行一次:0 0 23 * * ? 每天凌晨1点执行一次:0 0 1 * * ? 每月1号凌晨1点执行一次:0 0 1 1 * ? 每月最后一天23点执行一次:0 0 23 L * ? 每周星期六凌晨1点实行一次:0 0 1 ? * L 在26分、29分、33分执行一次:0 26,29,33 * * * ? 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ? 另外, cron 属性接收的 cron表达式 支持占位符。eg: 配置文件: 每5秒执行一次: 时区,接收一个 java.util.TimeZone#ID 。 cron表达式 会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区 Asia/Shanghai 。该字段我们一般留空。 上一次执行完毕时间点之后多长时间再执行。如: 与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如: 占位符的使用(配置文件中有配置:time.fixedDelay=5000): 运行结果: 上一次开始执行时间点之后多长时间再执行。如: 与 5. fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。 第一次延迟多长时间后再执行。如: 与 7. initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。 That"s all ! Thanks for reading. 截至 spring-context-4.3.14.RELEASE 的源码 Spring - Quartz - cronExpression中问号(?)的解释 在线Cron表达式生成器 Spring Cloud 进阶玩法 统一异常处理介绍及实战 分布式锁可以这么简单? Spring Cloud Stream 进阶配置——使用延迟队列实现“定时关闭超时未支付订单” Spring Cloud Stream 进阶配置——高可用(二)——死信队列
2023-07-21 19:58:461

spring boot @Scheduled未生效原因

在spring boot中,支持多种定时执行模式(cron, fixRate, fixDelay),在Application或者其他Autoconfig上增加 @EnableScheduling注解开启。 然后在指定方法增加@Scheduled注解,如下: 需要注意的是,如果在多个函数上使用了@Scheduled,那么一定是一个执行完毕,才能排下一个。这往往不是我们想要的效果。此时需要在Scheduling配置类为schedule返回一个预定的线程池,如下: 完成之后,多个@Scheduled可以并发执行了,最高并发度是3,但是同一个@Schedule不会并发执行。 人生没有彩排,每天都是现场直播,开弓没有回头箭,努力在当下。
2023-07-21 19:58:541

scheduled的副词是什么

scheduledly v.安排(schedule的过去分词);把…列表;把…列入计划 adj.预定的;已排程的 没有副词可言
2023-07-21 19:59:151

英文schedule 用法

这是一个时式问题。 1. 一个会议已经定于xx日举行: A meeting has been scheduled/ is scheduled for Friday. 讲此话时个会未开;但已决定几时开。 2. 将会决定一个会几时开,讲的时候仍未决定几时开: A meeting will be scheduled. 3. 当你同人讲翻以前发生过或发生咗嘅事,就要用过去式: 今日系七月五日, 你想讲翻六月一日决定在六月十日开会就可以话 A meeting was scheduled for 10 June. 当你表达一件没有时间和空间因素的事实时,便用is scheduled: The meeting is scheduled to gather all staff to discuss... 当你表达一个已过去编排了时间表事件时,便用was scheduled: The meeting was scheduled yesterday. 当你表达一个将会编排发生的事件时,便用will be scheduled: A meeting will be scheduled for next week. 跟几时用go went will go一样。
2023-07-21 19:59:221

schedule作为动词的用法

schedule时间表
2023-07-21 19:59:313

怎样关闭scheduledexecutorservice

用 ScheduledExecutorService.shutdownNow()shutdown() 方法 还会把后续任务都执行完毕才关闭。
2023-07-21 19:59:591

schedule的名词

schedule的名词schedule schedule n.工作计划;日程安排;(电视或广播)节目表; v.安排;为…安排时间;预定;列入 现在分词: scheduling 过去式: scheduled 过去分词: scheduled 扩展资料   There may be some minor changes to the schedule.   时间安排也许会有些小小的"变动。   We"re working to a tight schedule.   我们的工作安排得很紧。   Chinese will be on the school schedule from next year.   从明年开始中文将排进学校的课程表。
2023-07-21 20:00:171

怎么停止scheduledexecutorservice 定时任务

你好,用 ScheduledExecutorService.shutdownNow() shutdown() 方法 还会把后续任务都执行完毕才关闭。
2023-07-21 20:00:241

be scheduled on还是 for加日期

正确的运用应该是be scheduled for+时间;通常都是被动式的.安排;为...安排时间;预定;e.g:The meeting is scheduled for Friday afternoon.会议安排在周五下午 扩展资料  The meeting is scheduled to commence at noon.  会议定于午间召开。  The volume of scheduled flights is straining the air traffic control system  定期航班的数量正让空中交通指挥系统不堪重负。  The space shuttle had been scheduled to blast off at 04:38  航天飞机已经预定于凌晨4点38分发射升空。
2023-07-21 20:00:321

be scheduled for 和be scheduled to 有什么区别

be scheduled for :预定,安排,排定时间或曰期 ;后面接名词或者动名词be scheduled to 预定,预期;计划做后面接动词原型
2023-07-21 20:00:391

@Scheduled(cron = "0/5 * * * * *")将时间改为配置

有两种方法:第一种当然你可以把Scheduled写到xml文件中进行配置。第二种在你的类前面添加@PropertySource("classpath:root/test.props")然后修改你的@Scheduled(cron="0/5 * * * * ? ") 为 @Scheduled(cron="${jobs.schedule}") 最后test.props 添加 jobs.schedule = 0/5 * * * * ?
2023-07-21 20:00:471

请问be scheduled for 和be scheduled to 有什么区别?

Be scheduled for something (N.)名词Be scheduled to do sth (V.)动词
2023-07-21 20:00:553

as is scheduled, as scheduled, as it is scheduled 有什么区别

Asisscheduled中as是关系代词,引起一个定语从句。asscheduled可看成过去分词前加连词的用法,也可理解为省去了主语和谓语(be动词),常做状语。asitisscheduled和asscheduled基本相同,都作状语。不同的是asscheduled省去的主语不一定是it,省去的be动词也不一定是is。
2023-07-21 20:01:021

Spring 定时任务 @Scheduled cron表达式

我们在开发时经常会遇到一些需要定时执行的小任务,使用了 springboot 的定时任务后变得更加简单快捷,下面举个例子: Java配置中开户对Scheduled的支持: Schedule定时器cron表达式: Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 一个cron表达式由空格分隔6个或者7个占位符组成,每个占位符代表不同意义,分别为:秒、分钟、小时、日、月、周、年 * :代表整个时间段。假如在Minutes域使用*, 即表示每分钟都会触发事件。 ? :表示每月的某一天,或第周的某一天;只能用在DayofMonth和DayofWeek两个域,表示不指定值。当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用 ,如果使用 表示不管星期几都会触发,实际上并不是这样。 - :表示范围,例如在Minutes域使用 5-20,表示从5分到20分钟每分钟触发一次 。 / :表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用“0/10”,表示每隔10分钟执行一次,“0”表示为从“0”分开始;如果是“5/20”,则意味着从5分开始,每20分钟触发一次,而25,45等分别触发一次,“5”表示从第5分钟开始执行.。 , :表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在第5分和第20分各触发一次。 L :表示最后,只能出现在DayofWeek和DayofMonth域,用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几。如果在DayofWeek域使用“5L”,意味着在最后的一个星期四触发;如“6L”表示“每月的最后一个星期五”。 W :表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用“5W”表示为“到本月5日最近的工作日”,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份。 LW :这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。 # :用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示每月的第二个星期三;如果是”6#3” 或 “FRI#3”,则表示“每月第三个星期五”。 最后推荐一个在线cron表达式生成器: http://cron.qqe2.com/
2023-07-21 20:01:091

java scheduled 多个定时任务会冲突吗

定时任务本身不会有冲突,有冲突的是任务中操作处理的资源或数据,需要对有写入的文件或数据进行排它锁,保障线程处理的安全性。
2023-07-21 20:01:171

英语Scheduled Time怎么翻译?

Scheduled Time,这个英文短语的中文翻译是:预定时间。经常出现在调度语句中。
2023-07-21 20:01:241

scheduledexecutorservice 定时任务 只执行一次怎么回事

下面是该接口的原型定义java.util.concurrent.ScheduleExecutorService extends ExecutorService extends Executor接口scheduleAtFixedRate原型定义及参数说明[java] view plain copypublic ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit); command:执行线程initialDelay:初始化延时period:两次开始执行最小间隔时间unit:计时单位接口scheduleWithFixedDelay原型定义及参数说明[java] view plain copy
2023-07-21 20:01:451

be scheduled for

很明显 be scheduled to 计划做某事 例子: He"s scheduled to go swimming.他按计划将去游泳. be scheduled for 是为.准备的,是用来做.的 例子: The goods are scheduled for transport.这些货物是供运输的. 祝好!
2023-07-21 20:01:541

spring scheduled 是单线程还是多线程

首先要配置我们的spring.xml xmlns 多加下面的内容、 然后xsi:schemaLocation多加下面的内容、 最后是我们的task任务扫描注解 [html] view plaincopy 我的配置扫描位置是: [html] view plaincopy 扫描的是com.test这样的包下的内容、 下面需要
2023-07-21 20:02:032

Spring 配置的@Scheduled(cron = "0 1/5 5-21 * *?")任务,在同一时刻重复执行,求解决方法

你这个的配置不就是每天从5点到21 点,从1 分钟开始每5分钟循环执行么? 有什么不对吗?
2023-07-21 20:02:123

scheduled departure是什么意思

原定出发时间;预定发车eg.The first available ship is scheduled for departure of August 10. 第一条可供货轮将于8月10日启航.
2023-07-21 20:02:312

spring的@scheduled定时任务怎么加返回值,方法是void类型

定时任务是定时启动,你其他方法也调用不了。就算有返回值,你也获取不了。你的代码思路不对。
2023-07-21 20:02:391

as schedule 和as scheduled 的区别

没有as schedule这个短语吧,后者是固定短语。
2023-07-21 20:02:482

@scheduled是从启动开始算吗

<task:scheduler id="taskScheduler" /><!--fixed-delay="1000" 每秒触发一次initial-delay="3000" 启动后延迟3秒后开始首次触发--><task:scheduled-tasks><task:scheduled fixed-delay="1000" initial-delay="3000" ref="task" method="method"/></task:scheduled-tasks>
2023-07-21 20:03:111

@scheduled可以设置为每次在项目重启时才调用吗?

<task:scheduler id="taskScheduler" /> <!-- fixed-delay="1000" 每秒触发一次 initial-delay="3000" 启动后延迟3秒后开始首次触发 --> <task:scheduled-tasks> <task:scheduled fixed-delay="1000" initial-delay="3000" ref="task" method="method"/> </task:scheduled-tasks>
2023-07-21 20:03:191

spring scheduled 怎么测试

首先要配置我们的spring.xml xmlns 多加下面的内容、 然后xsi:schemaLocation多加下面的内容、 最后是我们的task任务扫描注解 [html] view plaincopy 我的配置扫描位置是: [html] view plaincopy 扫描的是com.test这样的包下的内容、 下面需要
2023-07-21 20:03:281

scheduled flight是什么意思

scheduled flight英[u02c8skedu0292u:ld flait]美[u02c8sku025bdu0292uld flau026at]n.定期航班网络定期飞航1Pan Am inaugurated the first scheduled international flight.泛美航空公司开通了第一条国际定期航班线路。2The crash occurred on a demonstration flight as part of a carefully scheduled six-nation Asian road show.这架飞机是在参加六国巡回展演的途中失事的。
2023-07-21 20:03:363

请问be scheduled for 和be scheduled to 有什么区别?

很明显bescheduledto计划做某事例子:He"sscheduledtogoswimming.他按计划将去游泳。bescheduledfor是为。。。准备的,是用来做。。。的例子:Thegoodsarescheduledfortransport.这些货物是供运输的。祝好!
2023-07-21 20:03:441

be scheduled to do是什么意思

bescheduledtodo计划做某事双语对照例句:1.Mrromneyisscheduledtobeinohiotoday.罗姆尼计划今天前往俄亥俄州。2.Abetaversionisscheduledtobereleasedthursday.beta版本计划在周二发布。3.Earningscallisscheduledtobeginshortly.Groupon计划将很快召开营收电话会议。
2023-07-21 20:03:501

spring 注解@scheduled在哪个包先

首先要配置我们的spring.xmlxmlns 多加下面的内容、然后xsi:schemaLocation多加下面的内容、最后是我们的task任务扫描注解[html] view plaincopy<task:annotation-driven/> 我的配置扫描位置是:[html] view plaincopy<context:annotation-config/> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
2023-07-21 20:03:571

@scheduled配置问题?

1,通过属性暴露状态2,通关状态或钩子方法控制执行流程3,慎用spring的调度功能。
2023-07-21 20:04:312

be scheduled to do造个句子

1.Of course,the Fund"s own unique risk and will not be scheduled to vote to eliminate. 当然,基金本身特有的风险并不会因为定投而消除. 2.The railway is scheduled to be opened to traffic on May Day. 这条铁路准备在“五一”通车. 3.The meeting was tentatively scheduled to be held Tuesday.x05 这个会议暂定于星期二举行. 4.You are scheduled to have an operation. 您要预定动手术. 5.We are scheduled to arrive at 10:30. 我们10时30分抵达. 6.He was scheduled to attend the party. 他预定出席那个宴会. 7.You are scheduled to meet the president at ten. 十点钟你要去见总经理.
2023-07-21 20:04:401