亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

定時(shí)任務(wù)作為一種系統(tǒng)調(diào)度工具,在一些需要有定時(shí)作業(yè)的系統(tǒng)中應(yīng)用廣泛,如每逢某個(gè)時(shí)間點(diǎn)統(tǒng)計(jì)數(shù)據(jù)、在將來某個(gè)時(shí)刻執(zhí)行某些動作...定時(shí)任務(wù)在主流開發(fā)語言均提供相應(yīng)的API供開發(fā)者調(diào)用,在JAVA中,實(shí)現(xiàn)定時(shí)任務(wù)有很多種方式,原生的方式實(shí)現(xiàn)一個(gè)完整定時(shí)任務(wù)需要由Timer、TimerTask兩個(gè)類,Timer是定時(shí)器類,用來按計(jì)劃開啟后臺線程執(zhí)行指定任務(wù),TimerTask一個(gè)抽象類,它的子類代表一個(gè)可以被Timer計(jì)劃的任務(wù)。除此之外,還可以用ScheduledExecutorService類或者使用第三方j(luò)ar庫Quartz,其中Quartz是一個(gè)優(yōu)秀的定時(shí)任務(wù)框架,發(fā)展至今已經(jīng)非常成熟,以致后來其他的定時(shí)任務(wù)框架的核心思想或底層大多源于Quartz。

springboot作為Java的一種開發(fā)框架,在springboot項(xiàng)目中實(shí)現(xiàn)定時(shí)任務(wù)不僅可以使用Java提供的原生方式,還可以使用springboot提供的定時(shí)任務(wù)API,下面,小編把Java原生和springboot所有的實(shí)現(xiàn)定時(shí)任務(wù)的方式做一個(gè)整合。

文章提綱: 1、使用線程 2、使用Timer類 3、使用ScheduledExecutorService類 4、使用Quartz 5、使用spring的@Scheduled注解 6、cron表達(dá)式

1. 線程實(shí)現(xiàn)

利用線程可以設(shè)定休眠時(shí)間的方式可以實(shí)現(xiàn)簡單的定時(shí)任務(wù)邏輯。

	public static void main(String[] args){
		//定時(shí)任務(wù)間隔時(shí)間
		int sleepTime=2*1000;
		new Thread(new Runnable() {
			@Override
			public void run() {
				while (true){
					try {
						System.out.println("Thread方式執(zhí)行一次定時(shí)任務(wù)");
						//線程休眠規(guī)定時(shí)間
						Thread.sleep(sleepTime);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
	}

2. Timer類

Timer類允許調(diào)度一個(gè)TimerTask任務(wù)。使用這種方式可以讓你的程序按照某一個(gè)頻度執(zhí)行。

	public static void main(String[] args){
		int sleepTime=2*1000;
		TimerTask timerTask = new TimerTask() {
			@Override
			public void run() {
				System.out.println("Timer方式執(zhí)行一次定時(shí)任務(wù)");
			}
		};
		new Timer().schedule(timerTask,1,sleepTime);
	}

3. ScheduledExecutorService類

ScheduledExecutorService,是基于線程池設(shè)計(jì)的定時(shí)任務(wù)類,每個(gè)調(diào)度任務(wù)都會分配到線程池中的一個(gè)線程去執(zhí)行,也就是說,任務(wù)是并發(fā)執(zhí)行,互不影響。 因此,基于ScheduledExecutorService類的定時(shí)任務(wù)類,歸根到底也是基于線程的調(diào)度實(shí)現(xiàn)的。

	public static void main(String[] args){
		int sleepTime=2*1000;
		ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
		scheduledExecutor.scheduleAtFixedRate(
				new Runnable() {
					@Override
					public void run() {
						System.out.println("ScheduledExecutorService方式執(zhí)行一次定時(shí)任務(wù)");
					}
				}
		,1,sleepTime, TimeUnit.SECONDS);
	}

4. 整合Quartz

Quartz是一個(gè)完全由Java編寫的開源作業(yè)調(diào)度框架,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡單卻強(qiáng)大的機(jī)制,要理解它的使用方式,需要先理解它的幾個(gè)核心概念:

Job: 表示一個(gè)工作,要執(zhí)行的具體內(nèi)容。此接口中只有一個(gè)方法,如下: void execute(JobExecutionContext context)JobDetail: 表示一個(gè)具體的可執(zhí)行的調(diào)度程序,Job 是這個(gè)可執(zhí)行程調(diào)度程序所要執(zhí)行的內(nèi)容,另外 JobDetail 還包含了這個(gè)任務(wù)調(diào)度的方案和策略。Trigger: 代表一個(gè)調(diào)度參數(shù)的配置,什么時(shí)候去調(diào)。Scheduler: 代表一個(gè)調(diào)度容器,一個(gè)調(diào)度容器中可以注冊多個(gè) JobDetail 和Trigger。當(dāng) Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調(diào)度了。

有了這些概念之后,我們就可以把Quartz整合到我們的springboot項(xiàng)目中了。

引入quartz依賴

<dependency>
   <groupid>org.springframework.boot</groupid>
   <artifactid>spring-boot-starter-quartz</artifactid>
</dependency>

配置

@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail quartzDetail(){
        return JobBuilder.newJob(QuartzTest.class).withIdentity("QuartzTest").storeDurably().build();
    }
    @Bean
    public SimpleTrigger quartzTrigger(){
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)
                .repeatForever();
        return TriggerBuilder.newTrigger().forJob(quartzDetail())
                .withIdentity("QuartzTest")
                .withSchedule(scheduleBuilder)
                .build();
    }
}

測試

public class QuartzTest extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext){
        System.out.println("quartz執(zhí)行一次定時(shí)任務(wù) ");
    }
}

5. 使用Scheduled注解

@Scheduled是spring為定時(shí)任務(wù)而生的一個(gè)注解,查看注解的源碼:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
//cron表達(dá)式
	String cron() default "";
//接收一個(gè)java.util.TimeZone#ID。
	String zone() default "";
//上一次執(zhí)行完畢時(shí)間點(diǎn)之后多長時(shí)間再執(zhí)行
	long fixedDelay() default -1;
//支持占位符形式的字符串類型的fixedDelay
	String fixedDelayString() default "";
//上一次開始執(zhí)行時(shí)間點(diǎn)之后多長時(shí)間再執(zhí)行
	long fixedRate() default -1;
//支持占位符形式的字符串類型的fixedRateString
	String fixedRateString() default "";
//第一次延遲多長時(shí)間后再執(zhí)行	
	long initialDelay() default -1;
//支持占位符形式的字符串類型的initialDelay
	String initialDelayString() default "";
}

可以看出:Scheduled注解中的參數(shù)用來設(shè)置“定時(shí)”動作,通常情況下,比較常用的參數(shù)是cron(),這意味著我們需要學(xué)會一些cron表達(dá)式相關(guān)的語法,但由于內(nèi)容較多,篇幅較長,在這里暫不鋪開講解,我們把cron語法相關(guān)放到文章最后,在此先講解如何用Scheduled注解來實(shí)現(xiàn)定時(shí)任務(wù)。

開啟定時(shí)任務(wù)支持

@SpringBootApplication
/**
 * 開啟定時(shí)任務(wù)支持
 */
@EnableScheduling
public class TestApplication  extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(this.getClass());
    }
}

使用

@Component
public class ScheduledTest {
    private Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
    /**
     * 每15秒執(zhí)行一次定時(shí)任務(wù)
     */
    @Scheduled(cron = "0/15 * * * * ? ")
    public void testCron(){
        logger.info("Scheduled 執(zhí)行一次定時(shí)任務(wù)");
    }
}

6. cron表達(dá)式

cron表達(dá)式是一個(gè)字符串其語法為:

[秒] [分] [小時(shí)] [日] [月] [周] [年]

其中[年]為非必填項(xiàng),因此通常cron表達(dá)式通常由6或7部分內(nèi)容組成,內(nèi)容的取值為數(shù)字或者一些cron表達(dá)式約定的特殊字符,這些特殊字符稱為“通配符”,每一個(gè)通配符分別代指一種值。cron表達(dá)式可以用這樣的表格來表示:

|順序|取值范圍|特殊字符串范圍| |--|--|--| |秒|0~60|, - * /| |分|0-60|, - * /| |時(shí)|0-23|, - * /| |日|1-31|, - * /| |月|1-12 / JAN-DEC|, - * ? / L W| |周|1-7 / SUN-SAT|, - * ? / L #| |年(可省略)|1970-2099|, - * /|

其中通配符的解釋以及作用如下:

|通配符|代表的值|解釋| |--|--|--| ||所有值|如:時(shí)字段為,代表每小時(shí)都觸發(fā)| |?|不指定值|如:周字段為?,代表表達(dá)式不關(guān)心是周幾| |-|區(qū)間|如:時(shí)字段設(shè)置2-5,代表2,3,4,5點(diǎn)鐘時(shí)都觸發(fā)| |,|多個(gè)值|如:時(shí)字段設(shè)置2,3,5,代表2,3,5點(diǎn)都會觸發(fā)| |/|遞增值|如:時(shí)字段設(shè)置0/2,代表每兩個(gè)小時(shí)觸發(fā),時(shí)字段設(shè)置 2/5,代表從2時(shí)開始每隔5小時(shí)觸發(fā)一次| |L|最后值|如:日字段設(shè)置L,代表本月最后一天| |W|最近工作日|如:在日字段設(shè)置13W,代表沒約13日最近的那個(gè)工作日觸發(fā)一次| |#|序號|如:在周字段設(shè)置5#2,代表每月的第二個(gè)周五|

示例: 每2秒執(zhí)行一次:0/5 * * * * ? 每5分鐘執(zhí)行一次:0 0/5 * * * ? 1分、12分、45分執(zhí)行一次:0 1,12,45 * * * ? 每天23點(diǎn)59分59秒執(zhí)行一次:59 59 23 * * ? 每月15號凌晨3點(diǎn)執(zhí)行一次:0 0 3 15 * ? 每月最后一天12點(diǎn)執(zhí)行一次:0 0 12 L * ?

分享到:
標(biāo)簽:SpringBoot
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定