Panduan untuk ShedLock dengan Spring

1. Gambaran keseluruhan

Spring menyediakan API yang mudah dilaksanakan untuk menjadwalkan pekerjaan. Ia berfungsi dengan baik sehingga kami menyebarkan beberapa contoh aplikasi kami. Musim bunga, secara lalai, tidak dapat menangani penyegerakan penjadual pada beberapa keadaan - sebaliknya menjalankan tugas secara serentak pada setiap simpul.

Dalam tutorial ringkas ini, kita akan melihat ShedLock - perpustakaan Java yang memastikan tugas berjadual kita berjalan hanya sekali pada masa yang sama dan merupakan alternatif kepada Quartz.

2. Pergantungan Maven

Untuk menggunakan ShedLock dengan Spring, kita perlu menambahyang shedlock-spring pergantungan:

 net.javacrumbs.shedlock shedlock-spring 2.2.0 

3. Konfigurasi

Perhatikan bahawa ShedLock hanya berfungsi di persekitaran dengan pangkalan data bersama dengan menyatakan LockProvider yang betul . Ia membuat jadual atau dokumen dalam pangkalan data di mana ia menyimpan maklumat mengenai kunci semasa.

Pada masa ini, ShedLock menyokong Mongo, Redis, Hazelcast, ZooKeeper, dan apa sahaja dengan pemacu JDBC.

Untuk contoh ini, kami akan menggunakan pangkalan data H2 dalam memori. Untuk menjadikannya berfungsi, kita perlu menyediakan pangkalan data H2 dan ketergantungan ShedLock's JDBC:

 net.javacrumbs.shedlock shedlock-provider-jdbc-template 2.1.0   com.h2database h2 1.4.200 

Seterusnya, kita perlu membuat jadual pangkalan data untuk ShedLock untuk menyimpan maklumat mengenai kunci penjadual:

CREATE TABLE shedlock ( name VARCHAR(64), lock_until TIMESTAMP(3) NULL, locked_at TIMESTAMP(3) NULL, locked_by VARCHAR(255), PRIMARY KEY (name) )

Kita perlu mengisytiharkan sumber data dalam hartanah permohonan Spring Boot kita memfailkan supaya sumber data kacang boleh menjadi Autowired . Dalam contoh ini, kami menggunakan application.yml untuk menentukan sumber data pangkalan data H2:

spring: datasource: driverClassName: org.h2.Driver url: jdbc:h2:mem:shedlock_DB;INIT=CREATE SCHEMA IF NOT EXISTS shedlock;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: 

Mari konfigurasikan LockProvider dengan konfigurasi sumber data di atas. Musim bunga boleh menjadikannya cukup mudah:

@Configuration public class SchedulerConfiguration { @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider(dataSource); } }

Satu lagi keperluan konfigurasi kita perlu sediakan adalah yang @EnableScheduling dan @EnableSchedulerLock anotasi pada kelas konfigurasi Spring kami:

@SpringBootApplication @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") public class Application { public static void main(String[] args) { SpringApplication.run(SpringApplication.class, args); } }

The defaultLockAtMostFor parameter menentukan amaun lalai masa kunci hendaklah disimpan dalam kes meninggal dunia nod melaksanakan. Ia menggunakan format Tempoh ISO8601.

Di bahagian seterusnya, kita akan melihat cara mengatasi lalai ini.

4. Membuat Tugas

Bagi membuat tugas dijadualkan dikendalikan oleh ShedLock, kita hanya meletakkan @Scheduled dan @SchedulerLock anotasi pada kaedah:

@Component class BaeldungTaskScheduler { @Scheduled(cron = "0 0/15 * * * ?") @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") public void scheduledTask() { // ... } }

Pertama, mari lihat @Jadual . Ini menyokong format cron , dengan ungkapan ini yang bermaksud "setiap 15 minit".

Seterusnya, mengambil melihat @SchedulerLock, yang nama parameter ini boleh menjadi unik, dan ClassName_methodName biasanya cukup untuk mencapainya. Kami tidak mahu lebih daripada satu kaedah dijalankan pada masa yang sama, dan ShedLock menggunakan nama unik untuk mencapainya.

Kami juga telah menambahkan beberapa parameter pilihan.

Pertama, kami telah menambahkan lockAtLeastForString supaya kami dapat meletakkan jarak antara kaedah panggilan. Menggunakan "PT5M" bermaksud kaedah ini akan menahan kunci selama 5 minit, minimum. Dengan kata lain, ini bermaksud bahawa kaedah ini dapat dijalankan oleh ShedLock tidak lebih kerap daripada setiap lima minit.

Seterusnya, kami menambahkan lockAtMostForString untuk menentukan berapa lama kunci harus disimpan sekiranya node pelaksana mati. Menggunakan "PT14M" bermaksud bahawa ia akan dikunci tidak lebih dari 14 minit.

Dalam situasi biasa, ShedLock melepaskan kunci secara langsung setelah tugas selesai. Sekarang, kami tidak perlu melakukannya kerana terdapat lalai yang disediakan di @EnableSchedulerLock , tetapi kami memilih untuk menimpanya di sini.

5. Kesimpulan

Dalam artikel ini, kami telah belajar bagaimana membuat dan menyegerakkan tugas yang dijadualkan menggunakan ShedLock.

Seperti biasa, semua kod sumber tersedia di GitHub.