激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務(wù)器之家 - 編程語言 - Java教程 - Java中定時任務(wù)的6種實現(xiàn)方式

Java中定時任務(wù)的6種實現(xiàn)方式

2022-03-07 00:27程序新視界 Java教程

這篇文章主要給大家分享的是Java中定時任務(wù)的6種實現(xiàn)方式,幾乎在所有的項目中,定時任務(wù)的使用都是不可或缺的,如果使用不當(dāng)甚至?xí)斐少Y損,下面文章我們就來看看Java中定時任務(wù)的具體使用方式吧

前言:

幾乎在所有的項目中,定時任務(wù)的使用都是不可或缺的,如果使用不當(dāng)甚至?xí)斐少Y損。還記得多年前在做金融系統(tǒng)時,出款業(yè)務(wù)是通過定時任務(wù)對外打款,當(dāng)時由于銀行接口處理能力有限,外加定時任務(wù)使用不當(dāng),導(dǎo)致發(fā)出大量重復(fù)出款請求。還好在后面環(huán)節(jié)將交易卡在了系統(tǒng)內(nèi)部,未發(fā)生資損。

所以,系統(tǒng)的學(xué)習(xí)一下定時任務(wù),是非常有必要的。這篇文章就帶大家整體梳理學(xué)習(xí)一下Java領(lǐng)域中常見的幾種定時任務(wù)實現(xiàn)。

1、線程等待實現(xiàn)

先從最原始最簡單的方式來講解。可以先創(chuàng)建一個thread,然后讓它在while循環(huán)里一直運行著,通過sleep方法來達到定時任務(wù)的效果。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Task {
 
    public static void main(String[] args) {
        // run in a second
        final long timeInterval = 1000;
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println("Hello !!");
                    try {
                        Thread.sleep(timeInterval);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

這種方式簡單直接,但是能夠?qū)崿F(xiàn)的功能有限,而且需要自己來實現(xiàn)。

2、JDK自帶Timer實現(xiàn)

目前來看,JDK自帶的Timer API算是最古老的定時任務(wù)實現(xiàn)方式了。Timer是一種定時器工具,用來在一個后臺線程計劃執(zhí)行指定任務(wù)。它可以安排任務(wù)“執(zhí)行一次”或者定期“執(zhí)行多次”。

在實際的開發(fā)當(dāng)中,經(jīng)常需要一些周期性的操作,比如每5分鐘執(zhí)行某一操作等。對于這樣的操作最方便、高效的實現(xiàn)方式就是使用java.util.Timer工具類。

2.1 核心方法

imer類的核心方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 在指定延遲時間后執(zhí)行指定的任務(wù)
schedule(TimerTask task,long delay);
 
// 在指定時間執(zhí)行指定的任務(wù)。(只執(zhí)行一次)
schedule(TimerTask task, Date time);
 
// 延遲指定時間(delay)之后,開始以指定的間隔(period)重復(fù)執(zhí)行指定的任務(wù)
schedule(TimerTask task,long delay,long period);
 
// 在指定的時間開始按照指定的間隔(period)重復(fù)執(zhí)行指定的任務(wù)
schedule(TimerTask task, Date firstTime , long period);
 
// 在指定的時間開始進行重復(fù)的固定速率執(zhí)行任務(wù)
scheduleAtFixedRate(TimerTask task,Date firstTime,long period);
 
// 在指定的延遲后開始進行重復(fù)的固定速率執(zhí)行任務(wù)
scheduleAtFixedRate(TimerTask task,long delay,long period);
 
// 終止此計時器,丟棄所有當(dāng)前已安排的任務(wù)。
cancal();
 
// 從此計時器的任務(wù)隊列中移除所有已取消的任務(wù)。
purge();

2.2使用示例

下面用幾個示例演示一下核心方法的使用。首先定義一個通用的TimerTask類,用于定義用執(zhí)行的任務(wù)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class DoSomethingTimerTask extends TimerTask {
 
    private String taskName;
 
    public DoSomethingTimerTask(String taskName) {
        this.taskName = taskName;
    }
 
    @Override
    public void run() {
        System.out.println(new Date() + " : 任務(wù)「" + taskName + "」被執(zhí)行。");
    }
}

2.2.1指定延遲執(zhí)行一次

 在指定延遲時間后執(zhí)行一次,這類是比較常見的場景,

比如:當(dāng)系統(tǒng)初始化某個組件之后,延遲幾秒中,然后進行定時任務(wù)的執(zhí)行。

?
1
2
3
4
5
6
7
public class DelayOneDemo {
 
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new DoSomethingTimerTask("DelayOneDemo"),1000L);
    }
}

執(zhí)行上述代碼,延遲一秒之后執(zhí)行定時任務(wù),并打印結(jié)果。其中第二個參數(shù)單位為毫秒。

2.2.2固定間隔執(zhí)行

在指定的延遲時間開始執(zhí)行定時任務(wù),定時任務(wù)按照固定的間隔進行執(zhí)行。比如:延遲2秒執(zhí)行,固定執(zhí)行間隔為1秒。

?
1
2
3
4
5
6
7
public class PeriodDemo {
 
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new DoSomethingTimerTask("PeriodDemo"),2000L,1000L);
    }
}

執(zhí)行程序,會發(fā)現(xiàn)2秒之后開始每隔1秒執(zhí)行一次。

2.2.3固定速率執(zhí)行

在指定的延遲時間開始執(zhí)行定時任務(wù),定時任務(wù)按照固定的速率進行執(zhí)行。

比如:延遲2秒執(zhí)行,固定速率為1秒。

?
1
2
3
4
5
6
7
public class FixedRateDemo {
 
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new DoSomethingTimerTask("FixedRateDemo"),2000L,1000L);
    }
}

執(zhí)行程序,會發(fā)現(xiàn)2秒之后開始每隔1秒執(zhí)行一次。

此時,你是否疑惑schedulescheduleAtFixedRate效果一樣,為什么提供兩個方法,它們有什么區(qū)別?

2.3 schedule與scheduleAtFixedRate區(qū)別

在了解schedulescheduleAtFixedRate方法的區(qū)別之前,先看看它們的相同點:

  • 任務(wù)執(zhí)行未超時,下次執(zhí)行時間 = 上次執(zhí)行開始時間 + period;
  • 任務(wù)執(zhí)行超時,下次執(zhí)行時間 = 上次執(zhí)行結(jié)束時間;

在任務(wù)執(zhí)行未超時時,它們都是上次執(zhí)行時間加上間隔時間,來執(zhí)行下一次任務(wù)。而執(zhí)行超時時,都是立馬執(zhí)行。

它們的不同點在于側(cè)重點不同,schedule方法側(cè)重保持間隔時間的穩(wěn)定,而scheduleAtFixedRate方法更加側(cè)重于保持執(zhí)行頻率的穩(wěn)定。

2.3.1schedule側(cè)重保持間隔時間的穩(wěn)定

schedule方法會因為前一個任務(wù)的延遲而導(dǎo)致其后面的定時任務(wù)延時。計算公式為scheduledExecutionTime(第n+1次) = realExecutionTime(第n次) + periodTime

也就是說如果第n次執(zhí)行task時,由于某種原因這次執(zhí)行時間過長,執(zhí)行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),則此時不做時隔等待,立即執(zhí)行第n+1次task。

而接下來的第n+2次task的scheduledExecutionTime(第n+2次)就隨著變成了realExecutionTime(第n+1次)+periodTime。這個方法更注重保持間隔時間的穩(wěn)定。

2.3.2scheduleAtFixedRate保持執(zhí)行頻率的穩(wěn)定

scheduleAtFixedRate在反復(fù)執(zhí)行一個task的計劃時,每一次執(zhí)行這個task的計劃執(zhí)行時間在最初就被定下來了,也就是scheduledExecutionTime(第n次)=firstExecuteTime +n*periodTime

如果第n次執(zhí)行task時,由于某種原因這次執(zhí)行時間過長,執(zhí)行完后的systemCurrentTime>= scheduledExecutionTime(第n+1次),則此時不做period間隔等待,立即執(zhí)行第n+1次task。

接下來的第n+2次的task的scheduledExecutionTime(第n+2次)依然還是firstExecuteTime+(n+2)*periodTime這在第一次執(zhí)行task就定下來了。說白了,這個方法更注重保持執(zhí)行頻率的穩(wěn)定。

如果用一句話來描述任務(wù)執(zhí)行超時之后schedule和scheduleAtFixedRate的區(qū)別就是:schedule的策略是錯過了就錯過了,后續(xù)按照新的節(jié)奏來走;scheduleAtFixedRate的策略是如果錯過了,就努力追上原來的節(jié)奏(制定好的節(jié)奏)。

2.4 Timer的缺陷

Timer計時器可以定時(指定時間執(zhí)行任務(wù))、延遲(延遲5秒執(zhí)行任務(wù))、周期性地執(zhí)行任務(wù)(每隔個1秒執(zhí)行任務(wù))。但是,Timer存在一些缺陷。首先Timer對調(diào)度的支持是基于絕對時間的,而不是相對時間,所以它對系統(tǒng)時間的改變非常敏感。

其次Timer線程是不會捕獲異常的,如果TimerTask拋出的了未檢查異常則會導(dǎo)致Timer線程終止,同時Timer也不會重新恢復(fù)線程的執(zhí)行,它會錯誤的認為整個Timer線程都會取消。同時,已經(jīng)被安排單尚未執(zhí)行的TimerTask也不會再執(zhí)行了,新的任務(wù)也不能被調(diào)度。故如果TimerTask拋出未檢查的異常,Timer將會產(chǎn)生無法預(yù)料的行為。

3、JDK自帶ScheduledExecutorService

ScheduledExecutorService是JAVA 1.5后新增的定時任務(wù)接口,它是基于線程池設(shè)計的定時任務(wù)類,每個調(diào)度任務(wù)都會分配到線程池中的一個線程去執(zhí)行。也就是說,任務(wù)是并發(fā)執(zhí)行,互不影響。

需要注意:只有當(dāng)執(zhí)行調(diào)度任務(wù)時,ScheduledExecutorService才會真正啟動一個線程,其余時間ScheduledExecutorService都是出于輪詢?nèi)蝿?wù)的狀態(tài)。

ScheduledExecutorService主要有以下4個方法:

?
1
2
3
4
ScheduledFuture<?> schedule(Runnable command,long delay, TimeUnit unit);
<V> ScheduledFuture<V> schedule(Callable<V> callable,long delay, TimeUnit unit);
ScheduledFuture<?> scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnitunit);
ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnitunit);

其中scheduleAtFixedRatescheduleWithFixedDelay在實現(xiàn)定時程序時比較方便,運用的也比較多。

ScheduledExecutorService中定義的這四個接口方法和Timer中對應(yīng)的方法幾乎一樣,只不過Timerscheduled方法需要在外部傳入一個TimerTask的抽象任務(wù)。 而ScheduledExecutorService封裝的更加細致了,傳RunnableCallable內(nèi)部都會做一層封裝,封裝一個類似TimerTask的抽象任務(wù)類(ScheduledFutureTask)。然后傳入線程池,啟動線程去執(zhí)行該任務(wù)。

3.1 scheduleAtFixedRate方法

scheduleAtFixedRate方法,按指定頻率周期執(zhí)行某個任務(wù)。定義及參數(shù)說明:

?
1
2
3
4
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
    long initialDelay,
    long period,
    TimeUnit unit);

參數(shù)對應(yīng)含義:command為被執(zhí)行的線程;initialDelay為初始化后延時執(zhí)行時間;period為兩次開始執(zhí)行最小間隔時間;unit為計時單位。

使用實例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ScheduleAtFixedRateDemo implements Runnable{
 
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        executor.scheduleAtFixedRate(
                new ScheduleAtFixedRateDemo(),
                0,
                1000,
                TimeUnit.MILLISECONDS);
    }
 
    @Override
    public void run() {
        System.out.println(new Date() + " : 任務(wù)「ScheduleAtFixedRateDemo」被執(zhí)行。");
        try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上面是scheduleAtFixedRate方法的基本使用方式,但當(dāng)執(zhí)行程序時會發(fā)現(xiàn)它并不是間隔1秒執(zhí)行的,而是間隔2秒執(zhí)行。

這是因為,scheduleAtFixedRate是以period為間隔來執(zhí)行任務(wù)的,如果任務(wù)執(zhí)行時間小于period,則上次任務(wù)執(zhí)行完成后會間隔period后再去執(zhí)行下一次任務(wù);但如果任務(wù)執(zhí)行時間大于period,則上次任務(wù)執(zhí)行完畢后會不間隔的立即開始下次任務(wù)。

3.2 scheduleWithFixedDelay方法

scheduleWithFixedDelay方法,按指定頻率間隔執(zhí)行某個任務(wù)。定義及參數(shù)說明:

?
1
2
3
4
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
    long initialDelay,
    long delay,
    TimeUnit unit);

參數(shù)對應(yīng)含義:command為被執(zhí)行的線程;initialDelay為初始化后延時執(zhí)行時間;period為前一次執(zhí)行結(jié)束到下一次執(zhí)行開始的間隔時間(間隔執(zhí)行延遲時間);unit為計時單位。

使用實例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class ScheduleAtFixedRateDemo implements Runnable{
 
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        executor.scheduleWithFixedDelay(
                new ScheduleAtFixedRateDemo(),
                0,
                1000,
                TimeUnit.MILLISECONDS);
    }
 
    @Override
    public void run() {
        System.out.println(new Date() + " : 任務(wù)「ScheduleAtFixedRateDemo」被執(zhí)行。");
        try {
            Thread.sleep(2000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

上面是scheduleWithFixedDelay方法的基本使用方式,但當(dāng)執(zhí)行程序時會發(fā)現(xiàn)它并不是間隔1秒執(zhí)行的,而是間隔3秒。

這是因為scheduleWithFixedDelay是不管任務(wù)執(zhí)行多久,都會等上一次任務(wù)執(zhí)行完畢后再延遲delay后去執(zhí)行下次任務(wù)。

4、Quartz框架實現(xiàn)

除了JDK自帶的API之外,我們還可以使用開源的框架來實現(xiàn),比如Quartz

Quartz是Job scheduling(作業(yè)調(diào)度)領(lǐng)域的一個開源項目,Quartz既可以單獨使用也可以跟spring框架整合使用,在實際開發(fā)中一般會使用后者。使用Quartz可以開發(fā)一個或者多個定時任務(wù),每個定時任務(wù)可以單獨指定執(zhí)行的時間,例如每隔1小時執(zhí)行一次、每個月第一天上午10點執(zhí)行一次、每個月最后一天下午5點執(zhí)行一次等。

Quartz通常有三部分組成:調(diào)度器(Scheduler)、任務(wù)(JobDetail)、觸發(fā)器(Trigger,包括SimpleTriggerCronTrigger)。下面以具體的實例進行說明。

4.1 Quartz集成

要使用Quartz,首先需要在項目的pom文件中引入相應(yīng)的依賴:

?
1
2
3
4
5
6
7
8
9
10
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.2</version>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz-jobs</artifactId>
    <version>2.3.2</version>
</dependency>

定義執(zhí)行任務(wù)的Job,這里要實現(xiàn)Quartz提供的Job接口:

?
1
2
3
4
5
6
public class PrintJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println(new Date() + " : 任務(wù)「PrintJob」被執(zhí)行。");
    }
}

創(chuàng)建SchedulerTrigger,并執(zhí)行定時任務(wù):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class MyScheduler {
 
    public static void main(String[] args) throws SchedulerException {
        // 1、創(chuàng)建調(diào)度器Scheduler
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        // 2、創(chuàng)建JobDetail實例,并與PrintJob類綁定(Job執(zhí)行內(nèi)容)
        JobDetail jobDetail = JobBuilder.newJob(PrintJob.class)
                .withIdentity("job", "group").build();
        // 3、構(gòu)建Trigger實例,每隔1s執(zhí)行一次
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "triggerGroup")
                .startNow()//立即生效
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(1)//每隔1s執(zhí)行一次
                        .repeatForever()).build();//一直執(zhí)行
 
        //4、Scheduler綁定Job和Trigger,并執(zhí)行
        scheduler.scheduleJob(jobDetail, trigger);
        System.out.println("--------scheduler start ! ------------");
        scheduler.start();
    }
}

執(zhí)行程序,可以看到每1秒執(zhí)行一次定時任務(wù)。

在上述代碼中,其中JobQuartz的接口,業(yè)務(wù)邏輯的實現(xiàn)通過實現(xiàn)該接口來實現(xiàn)。

JobDetail綁定指定的Job,每次Scheduler調(diào)度執(zhí)行一個Job的時候,首先會拿到對應(yīng)的Job,然后創(chuàng)建該Job實例,再去執(zhí)行Job中的execute()的內(nèi)容,任務(wù)執(zhí)行結(jié)束后,關(guān)聯(lián)的Job對象實例會被釋放,且會被JVM GC清除。

TriggerQuartz的觸發(fā)器,用于通知Scheduler何時去執(zhí)行對應(yīng)Job。SimpleTrigger可以實現(xiàn)在一個指定時間段內(nèi)執(zhí)行一次作業(yè)任務(wù)或一個時間段內(nèi)多次執(zhí)行作業(yè)任務(wù)。

CronTrigger功能非常強大,是基于日歷的作業(yè)調(diào)度,而SimpleTrigger是精準指定間隔,所以相比SimpleTriggerCroTrigger更加常用。CroTrigger是基于Cron表達式的。

常見的Cron表達式示例如下:

Java中定時任務(wù)的6種實現(xiàn)方式

可以看出,基于QuartzCronTrigger可以實現(xiàn)非常豐富的定時任務(wù)場景。

5、Spring Task

Spring 3開始,Spring自帶了一套定時任務(wù)工具Spring-Task,可以把它看成是一個輕量級的Quartz,使用起來十分簡單,除Spring相關(guān)的包外不需要額外的包,支持注解和配置文件兩種形式。通常情況下在Spring體系內(nèi),針對簡單的定時任務(wù),可直接使用Spring提供的功能。

基于XML配置文件的形式就不再介紹了,直接看基于注解形式的實現(xiàn)。

使用起來非常簡單,直接上代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Component("taskJob")
public class TaskJob {
 
    @Scheduled(cron = "0 0 3 * * ?")
    public void job1() {
        System.out.println("通過cron定義的定時任務(wù)");
    }
 
    @Scheduled(fixedDelay = 1000L)
    public void job2() {
        System.out.println("通過fixedDelay定義的定時任務(wù)");
    }
 
    @Scheduled(fixedRate = 1000L)
    public void job3() {
        System.out.println("通過fixedRate定義的定時任務(wù)");
    }
}

如果是在Spring Boot項目中,需要在啟動類上添加@EnableScheduling來開啟定時任務(wù)。

上述代碼中,@Component用于實例化類,這個與定時任務(wù)無關(guān)。@Scheduled指定該方法是基于定時任務(wù)進行執(zhí)行,具體執(zhí)行的頻次是由cron指定的表達式所決定。關(guān)于cron表達式上面CronTrigger所使用的表達式一致。與cron對照的,Spring還提供了fixedDelayfixedRate兩種形式的定時任務(wù)執(zhí)行。

5.1 fixedDelay和fixedRate的區(qū)別

fixedDelayfixedRate的區(qū)別于Timer中的區(qū)別很相似。

fixedRate有一個時刻表的概念,在任務(wù)啟動時,T1、T2、T3就已經(jīng)排好了執(zhí)行的時刻,比如1分、2分、3分,當(dāng)T1的執(zhí)行時間大于1分鐘時,就會造成T2晚點,當(dāng)T1執(zhí)行完時T2立即執(zhí)行。

fixedDelay比較簡單,表示上個任務(wù)結(jié)束,到下個任務(wù)開始的時間間隔。無論任務(wù)執(zhí)行花費多少時間,兩個任務(wù)間的間隔始終是一致的。

5.2 Spring Task的缺點

Spring Task 本身不支持持久化,也沒有推出官方的分布式集群模式,只能靠開發(fā)者在業(yè)務(wù)應(yīng)用中自己手動擴展實現(xiàn),無法滿足可視化,易配置的需求。

6、分布式任務(wù)調(diào)度

以上定時任務(wù)方案都是針對單機的,只能在單個JVM進程中使用。而現(xiàn)在基本上都是分布式場景,需要一套在分布式環(huán)境下高性能、高可用、可擴展的分布式任務(wù)調(diào)度框架。

6.1 Quartz分布式

首先,Quartz是可以用于分布式場景的,但需要基于數(shù)據(jù)庫鎖的形式。簡單來說,quartz的分布式調(diào)度策略是以數(shù)據(jù)庫為邊界的一種異步策略。各個調(diào)度器都遵守一個基于數(shù)據(jù)庫鎖的操作規(guī)則從而保證了操作的唯一性,同時多個節(jié)點的異步運行保證了服務(wù)的可靠。

因此,Quartz的分布式方案只解決了任務(wù)高可用(減少單點故障)的問題,處理能力瓶頸在數(shù)據(jù)庫,而且沒有執(zhí)行層面的任務(wù)分片,無法最大化效率,只能依靠shedulex調(diào)度層面做分片,但是調(diào)度層做并行分片難以結(jié)合實際的運行資源情況做最優(yōu)的分片。

6.2 輕量級神器XXL-Job

XXL-JOB是一個輕量級分布式任務(wù)調(diào)度平臺。特點是平臺化,易部署,開發(fā)迅速、學(xué)習(xí)簡單、輕量級、易擴展。由調(diào)度中心和執(zhí)行器功能完成定時任務(wù)的執(zhí)行。調(diào)度中心負責(zé)統(tǒng)一調(diào)度,執(zhí)行器負責(zé)接收調(diào)度并執(zhí)行。

針對于中小型項目,此框架運用的比較多。

6.3 其他框架

除此之外,還有Elastic-JobSaturnSIA-TASK等。

Elastic-Job具有高可用的特性,是一個分布式調(diào)度解決方案。

Saturn是唯品會開源的一個分布式任務(wù)調(diào)度平臺,在Elastic Job的基礎(chǔ)上進行了改造。

SIA-TASK是宜信開源的分布式任務(wù)調(diào)度平臺。

7、小結(jié)

通過本文梳理了6種定時任務(wù)的實現(xiàn),就實踐場景的運用來說,目前大多數(shù)系統(tǒng)已經(jīng)脫離了單機模式。對于并發(fā)量并不是太高的系統(tǒng),xxl-job或許是一個不錯的選擇。

到此這篇關(guān)于Java中定時任務(wù)的6種實現(xiàn)方式的文章就介紹到這了,更多相關(guān)Java中定時任務(wù)實現(xiàn)方式內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/6992719702032121864#heading-14

延伸 · 閱讀

精彩推薦
887
主站蜘蛛池模板: 欧洲伊人网| 欧美视频国产 | 日本中文视频 | 久草免费资源视频 | www.xxx视频| 视频一区二区三区在线播放 | 欧美日韩中文字幕在线视频 | 国产精品久久久不卡 | 欧美亚洲一级 | 国产精品亚洲精品日韩已方 | 91亚洲精品一区二区福利 | 久久精品一二三区白丝高潮 | 精品中文字幕久久久久四十五十骆 | 久久久久国产成人免费精品免费 | 成人18在线 | 久久国产亚洲视频 | 91综合影院| 成人毛片网站 | xxxx18韩国护士hd老师 | 5xsq在线视频| 日韩字幕在线观看 | 国产精品视频网 | 国产成人在线视频 | h视频在线免费看 | 免费观看一区二区三区视频 | 国产一国产一级毛片视频 | 久草免费新视频 | 成人444kkkk在线观看 | 特级西西444www大精品视频免费看 | 国产精品国产成人国产三级 | 麻豆视频在线观看免费网站 | chinese xxxx hd pron8 tube| 国产亚洲精品久久久久久久久久 | 91麻豆精品国产91久久久无需广告 | 看免费一级毛片 | 成人偷拍片视频在线观看 | 成人免费在线播放 | 久久精品国产99国产精品澳门 | 毛片在线视频免费观看 | 久久精品欧美一区二区三区不卡 | 成人富二代短视频 |