簡體   English   中英

Springboot:以編程方式啟動和停止計划任務

[英]Springboot: start a and stop programmatically a scheduled task

我有兩個不同的任務,我們稱它們為 A 和 B。

任務 A 應立即啟動 (t0) 並在固定時間 (t1) 后停止,任務 B 應在固定時間 (t1) 后啟動並運行直到我停止服務。

任務 A 和 B 都應該每 x 秒執行一次(為方便起見,打印一個字符串)。 我知道在 Springboot 中我可以使用這個注釋來實現:

@Scheduled(fixedDelay = 6000)
private void taskA(){
   print("A")
}

但是我不知道在 window 過去之后如何啟動和停止每個任務。 我做了一個簡單的方案來幫助你更好地理解。

在此處輸入圖像描述

謝謝

您可以通過org.springframework.scheduling.TaskScheduler以編程方式安排任務。

例如

    @Autowired
    private TaskScheduler taskScheduler;

    void scheduleTask(){
        final int xSeconds = 2000;
        PeriodicTrigger periodicTrigger = new PeriodicTrigger(xSeconds, TimeUnit.SECONDS);
        taskScheduler.schedule(
                () -> System.out.println("task B"),
                periodicTrigger
        );
    }

這篇文章也很有幫助。

您可以將fixedRateinitialDelay注釋結合使用。 因此 taskB 在 6100 毫秒的初始延遲后運行。

A --------- B ----- A -------- B ----- A ------>
t(0) t(5900) t(6000) t(1900) t(12000)

@Scheduled(fixedRate = 6000)
private void taskA(){
   System.out.println("A");
}

@Scheduled(fixedRate = 6000, initialDelay = 5000)
private void taskB(){
   System.out.println("B");
}

@Scheduled注釋適用於永遠運行的東西。 TaskScheduler用於必須停止的任務,將@Scheduled用於在您停止服務之前應該運行的任務。

這是一些代碼:

@Component
@RequiredArgsConstructor
public class Blam
implements
    Runnable
{
    private int count = 0;
    private ScheduledFuture<?> scheduledFuture = null;
    private final TaskScheduler taskScheduler;

    @Override
    public void run()
    {
        if (count < 6)
        {
            System.out.printf("%d: blam.taskA\n", count);
            ++count;
        }
        else
        {
            scheduledFuture.cancel(true);
        }
    }

    @PostConstruct
    public void postConstruct()
    {
        scheduledFuture = taskScheduler.scheduleWithFixedDelay(this, 1000);
    }
}

@Component
public class Kapow
{
    @Scheduled(initialDelay = 6000, fixedDelay = 1000)
    public void taskB()
    {
        System.out.println("Kapow.taskB");
    }
}

@RequiredArgsConstructor是一個 Lombok 注釋,我強烈推薦使用 Lombok。 如果您不使用 Lombok,只需根據您的選擇注入TashScheduler

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM