cari
RumahJavajavaTutorialBagaimana untuk melaksanakan beberapa tugas berjadual dalam Spring Boot

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);
    }
}

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);
    }
}

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>

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());
    }
}

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;
    }
}

@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>

@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: 🎜
  • Dilaksanakan setiap 5 saat: */5* * ?
  • Dilaksanakan setiap 1 minit: 0 /1 ?
  • 0 0 10.14,16 pagi
  • 0 0/30 9-17 ? Setiap setengah jam selama 9 hingga 5 jam bekerja
  • 0 0 12 ? pada pukul 12 tengah hari
  • "0 15 10 ? "Cuci setiap hari pada pukul 10:15 pagi
  • "0 15 10 ?" Dicetuskan setiap hari pada 10:15 AM
  • " 0 15 10 ? 2005" Dicetuskan setiap hari pada 10:15 AM pada tahun 2005
  • " 0
    14
  • ?" Dicetuskan setiap 1 minit sepanjang 59
  • "0 0/5 14 ?" hingga 2:55 ptg dan setiap 5 minit dari 6 ptg hingga 6: 55 ptg
  • "0 0-5 14 ?" 3 RABU" setiap hari Rabu pada bulan Mac pukul 2:10 dan 2:44 petang Pencetus
  • "0 15 10 ? ?" Dicetuskan pada jam 10:15 pagi pada 15hb setiap bulan
  • "0 15 10 L * ?" Dicetuskan pada jam 10:15 pagi pada hari terakhir setiap bulan
  • "0 15 10L" *dicetuskan? pada hari Jumaat terakhir setiap bulan pada pukul 10:15 pagi
  • "0 15 10 ? * 6L 2002-2005" Dicetuskan pada hari Jumaat terakhir setiap bulan pada pukul 10 pagi dari 2002 hingga 2005 :15 pencetus
    "
  • 0 15 10 ? * 6#3" Pencetus pada 10:15 pagi pada hari Jumaat ketiga setiap bulan
  • Sesetengah subungkapan boleh mengandungi beberapa julat atau senarai
  • Contohnya: subungkapan Formula (hari (minggu)) boleh jadilah "ISNIN-JUM", "ISNIN, RABU, JUMAAT", "ISNIN-RABU, SABTU"
  • Aksara "*" mewakili semua nilai yang mungkin Aksara "/" digunakan untuk menentukan kenaikan nilai

    Contohnya: "0/15" dalam subungkapan (minit) bermaksud bermula dari minit 0, setiap 15 minit "3/20" dalam subungkapan (minit) bermakna bermula dari minit ke-3, setiap 20 minit (ia mempunyai maksud yang sama seperti "3, 23, 43")

    Aksara "?" hanya digunakan selama beberapa hari Dua sub-ungkapan (bulan) dan hari (minggu), menunjukkan bahawa tiada nilai dinyatakan Apabila salah satu daripada dua subungkapan diberikan nilai, untuk mengelakkan konflik, nilai subungkapan yang lain perlu ditetapkan kepada "?"

    Watak "L" hanya digunakan untuk hari (bulan) dan hari (minggu ) ) dua subungkapan, yang merupakan singkatan untuk perkataan "terakhir" Jika ada sesuatu yang khusus sebelum "L", ia mempunyai makna lain.

    Contohnya: "6L" bermaksud hari ke-6 hingga akhir bulan ini Nota: Apabila menggunakan parameter "L", jangan nyatakan senarai atau julat kerana ini akan menyebabkan masalah

    Watak W mewakili hari bekerja (Isnin-Jumaat) dan hanya boleh digunakan dalam domain hari. Ia digunakan untuk menentukan hari minggu yang paling hampir dengan tarikh yang ditentukan. Kebanyakan pemprosesan perniagaan adalah berdasarkan minggu kerja, jadi watak W boleh menjadi sangat penting.

    Sebagai contoh, 15W dalam medan hari bermaksud "hari minggu yang paling hampir dengan 15 haribulan jika 15 hari Sabtu, maka pencetus akan dicetuskan pada 14 (Jumaat), kerana hari Khamis lebih dekat dengan hari." 15hb daripada Isnin.

    C: bermaksud "Kalendar". Ia bermaksud tarikh yang dikaitkan dengan jadual, atau semua tarikh dalam kalendar jika tarikh itu tidak dikaitkan.

    Sebagai contoh, 5C dalam medan tarikh adalah bersamaan dengan hari pertama selepas hari ke-5 dalam kalendar. 1C dalam medan hari minggu sepadan dengan hari pertama selepas Ahad.

    field allowed Values ​​ watak -watak khas
    Seconds 0 ~ 59 , - * /
    mins 0 ~ 59 , - * + . /

    在线cron表达式生成:http://qqe2.com/cron/index

    整合Quartz

    • 添加依赖

    如果Spring Boot版本是2.0.0以后的,则在spring-boot-starter中已经包含了quart的依赖,则可以直接使用spring-boot-starter-quartz依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>

    如果是1.5.9则要使用以下添加依赖:

    <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.3.0</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
    </dependency>

    这里我使用Spring Boot版本是2.0.0.BUILD-SNAPSHOT ,该版本开始集成了Quartz,所以事实现起来很方便。其它好像比较麻烦,这里就不介绍,以后有时间再详细深入了解Quartz。

    • 创建任务类TestQuartz,该类主要是继承了QuartzJobBean
    public class TestQuartz extends QuartzJobBean {
        /**
         * 执行定时任务
         * @param jobExecutionContext
         * @throws JobExecutionException
         */
        @Override
        protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
            System.out.println("quartz task "+new Date());
        }
    }
    • 创建配置类QuartzConfig
    @Configuration
    public class QuartzConfig {
        @Bean
        public JobDetail teatQuartzDetail(){
            return JobBuilder.newJob(TestQuartz.class).withIdentity("testQuartz").storeDurably().build();
        }
    
        @Bean
        public Trigger testQuartzTrigger(){
            SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInSeconds(10)  //设置时间周期单位秒
                    .repeatForever();
            return TriggerBuilder.newTrigger().forJob(teatQuartzDetail())
                    .withIdentity("testQuartz")
                    .withSchedule(scheduleBuilder)
                    .build();
        }
    }
    • 启动项目

    Bagaimana untuk melaksanakan beberapa tugas berjadual dalam Spring Boot

    最后

    上面都是简单的介绍了关于Spring Boot定时任务的处理,直接使用SpringTask注解的方式应该是最方便的,而使用Quartz从2.0开始也变得很方便。对于这两种方式,应该说各有长处吧,按需选择。

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan beberapa tugas berjadual dalam Spring Boot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:Java后端技术全栈. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Mengapa Java adalah pilihan yang popular untuk membangunkan aplikasi desktop silang platform?Mengapa Java adalah pilihan yang popular untuk membangunkan aplikasi desktop silang platform?Apr 25, 2025 am 12:23 AM

Javaispopularforcross-platformdesktopapplicationsduetoits "writeOnce, runanywhere" falsafah.1) itusesBytecodethatrunsonanyjvm-equippedplatform.2) LibrariesLikeswingandjavafxhelpcreatenativeS.3) ITseShipBareSivaryS

Bincangkan situasi di mana menulis kod khusus platform di Java mungkin diperlukan.Bincangkan situasi di mana menulis kod khusus platform di Java mungkin diperlukan.Apr 25, 2025 am 12:22 AM

Alasan untuk menulis kod khusus platform di Java termasuk akses kepada ciri sistem operasi tertentu, berinteraksi dengan perkakasan tertentu, dan mengoptimumkan prestasi. 1) Gunakan JNA atau JNI untuk mengakses Windows Registry; 2) Berinteraksi dengan pemandu perkakasan khusus Linux melalui JNI; 3) Gunakan logam untuk mengoptimumkan prestasi permainan pada macOS melalui JNI. Walau bagaimanapun, menulis kod khusus platform boleh menjejaskan mudah alih kod, meningkatkan kerumitan, dan berpotensi menimbulkan risiko overhead dan keselamatan.

Apakah trend masa depan dalam pembangunan Java yang berkaitan dengan kemerdekaan platform?Apakah trend masa depan dalam pembangunan Java yang berkaitan dengan kemerdekaan platform?Apr 25, 2025 am 12:12 AM

Java akan meningkatkan lagi kemerdekaan platform melalui aplikasi awan asli, penempatan pelbagai platform dan interoperabilitas silang bahasa. 1) Aplikasi asli awan akan menggunakan GraalVM dan Quarkus untuk meningkatkan kelajuan permulaan. 2) Java akan diperluaskan ke peranti tertanam, peranti mudah alih dan komputer kuantum. 3) Melalui Graalvm, Java akan mengintegrasikan dengan lancar dengan bahasa seperti Python dan JavaScript untuk meningkatkan interoperabilitas silang bahasa.

Bagaimanakah menaip Java yang kuat menyumbang kepada kemerdekaan platform?Bagaimanakah menaip Java yang kuat menyumbang kepada kemerdekaan platform?Apr 25, 2025 am 12:11 AM

Sistem taip kuat Java memastikan kemerdekaan platform melalui keselamatan jenis, penukaran jenis bersatu dan polimorfisme. 1) Jenis Keselamatan Melakukan pemeriksaan jenis pada masa penyusunan untuk mengelakkan kesilapan runtime; 2) peraturan penukaran jenis bersatu adalah konsisten di semua platform; 3) Polimorfisme dan mekanisme antara muka membuat kod berkelakuan secara konsisten pada platform yang berbeza.

Terangkan bagaimana antara muka asli Java (JNI) boleh menjejaskan kebebasan platform.Terangkan bagaimana antara muka asli Java (JNI) boleh menjejaskan kebebasan platform.Apr 25, 2025 am 12:07 AM

JNI akan memusnahkan kemerdekaan platform Java. 1) JNI memerlukan perpustakaan tempatan untuk platform tertentu, 2) Kod tempatan perlu disusun dan dihubungkan pada platform sasaran, 3) versi sistem operasi atau JVM yang berbeza mungkin memerlukan versi perpustakaan tempatan yang berbeza, 4) Kod tempatan boleh memperkenalkan kelemahan keselamatan atau menyebabkan kemalangan program.

Adakah terdapat teknologi baru yang mengancam atau meningkatkan kemerdekaan platform Java?Adakah terdapat teknologi baru yang mengancam atau meningkatkan kemerdekaan platform Java?Apr 24, 2025 am 12:11 AM

Teknologi yang muncul menimbulkan ancaman dan meningkatkan kemerdekaan platform Java. 1) Teknologi pengkomputeran awan dan kontena seperti Docker meningkatkan kemerdekaan platform Java, tetapi perlu dioptimumkan untuk menyesuaikan diri dengan persekitaran awan yang berbeza. 2) WebAssembly menyusun kod Java melalui GraalVM, memperluaskan kemerdekaan platformnya, tetapi ia perlu bersaing dengan bahasa lain untuk prestasi.

Apakah pelaksanaan JVM yang berbeza, dan adakah mereka semua menyediakan tahap kemerdekaan platform yang sama?Apakah pelaksanaan JVM yang berbeza, dan adakah mereka semua menyediakan tahap kemerdekaan platform yang sama?Apr 24, 2025 am 12:10 AM

Pelaksanaan JVM yang berbeza dapat memberikan kemerdekaan platform, tetapi prestasi mereka sedikit berbeza. 1. OracleHotspot dan OpenJDKJVM melakukan sama seperti kemerdekaan platform, tetapi OpenJDK mungkin memerlukan konfigurasi tambahan. 2. IBMJ9JVM melakukan pengoptimuman pada sistem operasi tertentu. 3. Graalvm menyokong pelbagai bahasa dan memerlukan konfigurasi tambahan. 4. AzulzingJVM memerlukan pelarasan platform tertentu.

Bagaimanakah kebebasan platform mengurangkan kos pembangunan dan masa?Bagaimanakah kebebasan platform mengurangkan kos pembangunan dan masa?Apr 24, 2025 am 12:08 AM

Kemerdekaan platform mengurangkan kos pembangunan dan memendekkan masa pembangunan dengan menjalankan set kod yang sama pada pelbagai sistem operasi. Khususnya, ia ditunjukkan sebagai: 1. Mengurangkan masa pembangunan, hanya satu set kod yang diperlukan; 2. Mengurangkan kos penyelenggaraan dan menyatukan proses ujian; 3. Penyebaran cepat dan kerjasama pasukan untuk memudahkan proses penempatan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa