Rumah > Java > javaTutorial > teks badan

Bagaimana untuk melaksanakan beberapa tugas berjadual dalam Spring Boot

Lepaskan: 2023-08-15 16:50:34
ke hadapan
1330 orang telah melayarinya

Dalam pembangunan sebenar, kami akan lebih kurang menggunakan beberapa senario tugas berjadual Artikel ini akan membincangkan tugas berjadual yang biasa digunakan.

Penyelesaian pelaksanaan tugas berjadual yang biasa digunakan termasuk yang berikut:

  • Pemasa: Ini adalah automatik java Dengan kelas java.util.Timer, kelas ini membolehkan anda menjadualkan java.util.TimerTaskTask. Menggunakan kaedah ini membolehkan program anda dilaksanakan pada frekuensi tertentu, tetapi bukan pada masa yang ditentukan. Umumnya kurang digunakan. Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
  • ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
  • Spring TaskSpring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
  • Quartz
  • ScheduledExecutorService: juga jdk sejak Kelas yang disertakan dengan; ialah kelas tugasan berjadual berdasarkan reka bentuk kumpulan benang Setiap tugasan yang dijadualkan akan diberikan kepada utas dalam kumpulan utas untuk dilaksanakan dengan kata lain, tugasan dilaksanakan secara serentak dan tidak menjejaskan satu sama lain.
  • Spring TaskTugas yang disertakan dengan Spring 3.0 bolehlah; dianggap sebagai Kuarza ringan dan lebih mudah digunakan daripada Kuarza.
    Quartz: Ini ialah Penjadual yang agak berkuasa boleh membenarkan program anda dilaksanakan pada masa tertentu atau pada frekuensi tertentu, tetapi konfigurasinya agak rumit.
  • Pangkalan data, buat jadual dan simpan ungkapan cron dalam jadual.

nacos, menggunakan konfigurasi teragih untuk melaksanakan konfigurasi dinamik ekspresi cron. . Untuk pengenalan terperinci, sila lihat API:

public class TestTimer {
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task  run:"+ new Date());
            }
        };
        Timer timer = new Timer();
        //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次
        timer.schedule(timerTask,10,3000);
    }
}
Salin selepas log masuk

Gunakan ScheduledExecutorService

Kaedah ini serupa dengan Pemasa, lihat sahaja demo:

public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 参数:1、任务体 2、首次执行的延时时间
        //      3、任务执行间隔 4、间隔时间单位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }
}
Salin selepas log masuk

Gunakan Spring Task

kita boleh gunakan tugasan Spring dengan mudah

anotasi yang sangat elegan untuk melaksanakan tugas berjadual, mula-mula buat projek, import kebergantungan:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>
Salin selepas log masuk

Buat kelas tugas: Bagaimana untuk melaksanakan beberapa tugas berjadual dalam Spring Boot

@Slf4j
@Component
public class ScheduledService {
    @Scheduled(cron = "0/5 * * * * *")
    public void scheduled(){
        log.info("=====>>>>>使用cron  {}",System.currentTimeMillis());
    }
    @Scheduled(fixedRate = 5000)
    public void scheduled1() {
        log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());
    }
    @Scheduled(fixedDelay = 5000)
    public void scheduled2() {
        log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());
    }
}
Salin selepas log masuk

Gunakan anotasi @EnableScheduling pada kelas utama untuk mendayakan sokongan untuk tugas berjadual, dan kemudian mulakan projek

Anda boleh melihat tiga Semua tugas yang dijadualkan telah dilaksanakan, dan ia dilaksanakan secara bersiri dalam urutan yang sama Jika hanya terdapat satu tugasan yang dijadualkan, ini pastinya tiada masalah Apabila bilangan tugasan yang dijadualkan meningkat, jika satu tugasan tersekat, tugas lain tidak akan dapat dilaksanakan. AsyncConfig

@Configuration
@EnableAsync
public class AsyncConfig {
     /*
    此处成员变量应该使用@Value从配置中读取
     */
    private int corePoolSize = 10;
    private int maxPoolSize = 200;
    private int queueCapacity = 10;
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }
}
Salin selepas log masuk

@Configuration:表明该类是一个配置类@EnableAsync:开启异步事件的支持

然后在定时任务的类或者方法上添加@Async

Pelaksanaan berbilang benang

Bagaimana untuk melaksanakan beberapa tugas berjadual dalam Spring BootDalam projek Spring tradisional, kami boleh menambah konfigurasi tugas dalam fail konfigurasi xml Dalam projek Spring Boot, kami biasanya menggunakan kelas konfigurasi konfigurasi untuk menambah konfigurasi, jadi buat AsyncConfig class

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
Salin selepas log masuk
Salin selepas log masuk

@Configuration: Menunjukkan bahawa kelas ialah kelas konfigurasi@EnableAsync: Hidupkan sokongan untuk acara tak segerak

Kemudian dalam kelas atau kaedah daripada tugas yang dijadualkan Tambah @Async . Akhir sekali mulakan semula projek, setiap tugas berada dalam urutan yang berbeza.

🎜🎜🎜🎜Konfigurasi masa pelaksanaan🎜🎜Dalam tugasan yang dijadualkan di atas, kami menggunakan anotasi @Scheduled pada kaedah untuk menetapkan masa pelaksanaan tugas dan menggunakan tiga kaedah konfigurasi atribut: 🎜
  1. fixedRate: Tentukan tugas berjadual yang dilaksanakan pada kekerapan tertentu
  2. fixedDelay: Tentukan tugas berjadual yang dilaksanakan pada kekerapan tertentu Perbezaan daripada di atas ialah menukar atribut boleh bekerjasama dengan initialDelay tentukan masa pelaksanaan tugas yang tertangguh.
  3. cron: Konfigurasikan masa pelaksanaan tugas melalui ungkapan

Penjelasan terperinci tentang ungkapan cron

Satu ungkapan cron mempunyai sekurang-kurangnya 6 (mungkin 7) elemen masa yang dipisahkan oleh ruang. Mengikut urutan:

  • saat (0~59)
  • minit (0~59)
  • 3 jam (0~23)
  • minit (0~59)
  • 3 jam (0~23)
  • 4 hari (0~3
    )
  • bulan (0~11)

🎜6 minggu (1~7 1=AHAD atau AHAD, ISNIN, SELASA, RABU, KHAM, JUMAAT, SABTU)🎜🎜🎜🎜Tahun (1970-2099)🎜🎜🎜 Setiap elemen boleh menjadi nilai (seperti 6), selang berterusan (9-12), selang (8-18/4) (/ bermaksud setiap 4 jam), senarai (1, 3, 5) , kad bebas. Memandangkan dua elemen "hari dalam bulan" dan "hari dalam minggu" adalah saling eksklusif, salah satu daripadanya mesti ditetapkan. Contoh konfigurasi: 🎜