Berbagi teknologi

SpringBoot harian: Implementasi @Scheduled dijalankan satu kali saat layanan dimulai

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Berbicara tentang tugas terjadwal, kita harus memikirkan @Scheduled, Quartz, dan XXL-JOB. Namun, beberapa layanan tunggal atau proyek kecil mungkin langsung menggunakan @Scheduled untuk mengimplementasikan tugas asinkron demi kenyamanan dan kecepatan. Oleh karena itu, persyaratan tema artikel ini diperluas.

Ketika @Scheduled digunakan dalam sebuah proyek, bagaimana tugas asinkron yang ditentukan dapat dijalankan terlebih dahulu ketika proyek dimulai?

1. Penjelasan detail @Scheduled

Anotasi @Scheduled mendukung beberapa parameter untuk mengontrol waktu pelaksanaan tugas secara fleksibel.

  • cron: Ekspresi cron, yang secara akurat dapat mengontrol detik, menit, jam, hari, bulan, minggu, dll.
    Masukkan deskripsi gambar di sini
  • zone: Menerima zona waktu, seperti Asia/Shanghai, zona waktu yang biasa kami gunakan.
  • fixedDelay: Berapa lama setelah waktu penyelesaian eksekusi terakhir akan dieksekusi lagi. Seperti @Scheduled(fixedDelay = 5000)
  • fixedDelayString: memiliki arti yang sama dengan fixedDelay, namun berbentuk string. Satu-satunya perbedaan adalah ia mendukung placeholder, seperti @Scheduled(fixedDelayString = "5000")
  • fixedRate: Berapa lama setelah waktu eksekusi terakhir dimulai, seperti @Scheduled(fixedRate = 5000)
  • fixedRateString: memiliki arti yang sama dengan fixedRate, namun berbentuk string. Satu-satunya perbedaan adalah bahwa placeholder didukung.
  • earlyDelay: Berapa lama penundaan eksekusi untuk pertama kalinya. Misalnya, akan dieksekusi setelah penundaan pertama 1 detik. Kemudian akan dieksekusi setiap 5 detik sesuai dengan aturan fixedRate 5000)
  • InitialDelayString: memiliki arti yang sama dengan InitialDelayString, namun berbentuk string. Satu-satunya perbedaan adalah bahwa placeholder didukung.

2. Implementasi logika

1. Buat metode logika tugas terjadwal

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Buat kelas eksekusi startup baru

Kelas ini terutama memanggil metode tugas yang ditentukan secara manual saat startup

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Catatan: Ingatlah untuk menambahkan @EnableScheduling ke kelas startup sehingga tugas yang dijadwalkan akan dijalankan. Tentu saja, hal ini tidak mempengaruhi pengujian logika artikel ini.

3. Hasil tes

Setelah layanan dimulai, lihat informasi pencetakan
Masukkan deskripsi gambar di sini