我有兩個不同的任務,我們稱它們為 A 和 B。
任務 A 應立即啟動 (t0) 并在固定時間 (t1) 后停止,任務 B 應在固定時間 (t1) 后啟動并運行直到我停止服務。
任務 A 和 B 都應該每 x 秒執行一次(為方便起見,列印一個字串)。我知道在 Springboot 中我可以使用這個注釋來實作:
@Scheduled(fixedDelay = 6000)
private void taskA(){
print("A")
}
但我不知道如何在時間視窗過去后啟動和停止每個任務。我做了一個簡單的方案來幫助你更好地理解。

謝謝
uj5u.com熱心網友回復:
您可以通過 以編程方式安排任務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
);
}
這篇文章也很有幫助。
uj5u.com熱心網友回復:
您可以fixedRate與initialDelay注釋結合使用。因此 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");
}
uj5u.com熱心網友回復:
@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您選擇的任何內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/506762.html
