SchedulerX mengambil alih job Spring @Scheduled yang sudah ada dengan perubahan kode minimal, menambahkan manajemen terpusat, pemantauan, peringatan, dan penjadwalan terdistribusi—tanpa mengubah logika job atau anotasi Anda.
Cara kerja
SchedulerX menggantikan penjadwal tugas Spring bawaan dengan mesin penjadwalannya sendiri:
Tambahkan dependensi SchedulerX Spring Boot starter ke proyek Anda.
Atur
spring.schedulerx2.task.scheduling.scheduler=schedulerxdi file application.properties Anda.SchedulerX mengambil kendali atas semua metode
@Scheduleddan mengelola eksekusinya melalui konsol.
Setelah pengambilalihan, frekuensi penjadwalan dikendalikan oleh konsol SchedulerX. Ekspresi cron dalam anotasi @Scheduled tetap berada di kode, tetapi tidak lagi menentukan kapan job dijalankan.
Mode eksekusi:
| Mode | Perilaku | Kasus penggunaan |
|---|---|---|
| Broadcast run | Setiap node pekerja menjalankan job secara simultan. | Refresh cache, pembersihan log, reload konfigurasi—tugas yang harus dilakukan oleh setiap node. Sesuai dengan perilaku asli Spring @Scheduled. |
| Stand-alone operation | Satu node pekerja yang dipilih secara acak menjalankan job. | Agregasi data, pembuatan laporan, pengiriman email—tugas yang hanya boleh dijalankan satu kali di seluruh kluster. |
Job yang disinkronisasi otomatis menggunakan mode default Broadcast run untuk mempertahankan perilaku asli Spring. Untuk menjalankan job hanya pada satu node, ubah Execution mode menjadi Stand-alone operation di konsol.
Prasyarat
Versi agen SchedulerX 1.8.13 atau lebih baru
Aplikasi Spring Boot yang terhubung ke SchedulerX. Untuk instruksi penyiapan, lihat Hubungkan aplikasi Spring Boot ke SchedulerX
Tambahkan dependensi Maven
Tambahkan dependensi schedulerx2-spring-boot-starter ke file pom.xml Anda. Ganti schedulerx2.version dengan versi terbaru dari catatan rilis agen.
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${schedulerx2.version}</version>
<!-- Exclude Log4j if your application uses Logback -->
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>Pertahankan @EnableScheduling di kelas utama Anda, terlepas dari apakah SchedulerX menangani penjadwalan atau tidak:
@SpringBootApplication
@EnableScheduling // Required -- do not remove
public class SchedulerXWorkerApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulerXWorkerApplication.class, args);
}
}Kelas job @Scheduled yang sudah ada tidak perlu diubah:
@Service
public class SpringScheduledProcessor {
@Scheduled(cron = "0/2 * * * * ?")
public void hello() {
logger.info(DateUtil.now() + " hello world. start");
logger.info(DateUtil.now() + " hello world. end");
}
}Menambahkan dependensi saja tidak mengubah perilaku job. SchedulerX tidak langsung mengambil alih job terjadwal Spring secara default—job tersebut tetap berjalan di kontainer Spring hingga Anda mengaktifkan pengambilalihan pada langkah berikutnya.
Konfigurasi pengambilalihan SchedulerX
Tambahkan properti berikut ke file application.properties Anda:
# Connect to SchedulerX
spring.schedulerx2.endpoint=${endpoint}
spring.schedulerx2.namespace=${namespace}
spring.schedulerx2.groupId=${groupId}
spring.schedulerx2.appKey=${appKey}
# Enable SchedulerX to take over Spring scheduled jobs
spring.schedulerx2.task.scheduling.scheduler=schedulerxUntuk mendapatkan parameter koneksi (endpoint, namespace, groupId, appKey):
Masuk ke Konsol SchedulerX.
Di panel navigasi sebelah kiri, klik Application Management.
Temukan aplikasi Anda dan klik Access configuration di kolom Operation.
Jika Anda belum membuat aplikasi di SchedulerX, buat terlebih dahulu sebelum melanjutkan.
Pilih cara mendaftarkan job
Setelah mengaktifkan pengambilalihan, daftarkan job Spring Anda di SchedulerX melalui salah satu dari dua metode berikut:
| Opsi | Paling cocok untuk | Cara |
|---|---|---|
| Auto-sync (direkomendasikan) | Jumlah besar @Scheduled job yang sudah ada | Tambahkan properti konfigurasi (lihat di bawah) |
| Manual creation | Kontrol selektif terhadap job individual | Buat setiap job di Konsol SchedulerX |
Opsi A: Sinkronisasi otomatis job yang ada (direkomendasikan)
Untuk menyinkronkan semua job @Scheduled ke SchedulerX secara otomatis, tambahkan properti berikut:
# Enable automatic job synchronization
spring.schedulerx2.task.scheduling.sync=true
spring.schedulerx2.regionId=<region-id>
spring.schedulerx2.aliyunAccessKey=<your-access-key>
spring.schedulerx2.aliyunSecretKey=<your-secret-key>Ganti placeholder dengan nilai aktual Anda:
| Placeholder | Deskripsi | Contoh |
|---|---|---|
<region-id> | Wilayah tempat instans SchedulerX Anda berjalan. Lihat Endpoints. | cn-hangzhou |
<your-access-key> | ID AccessKey Alibaba Cloud Anda | LTAI5tXxx |
<your-secret-key> | Rahasia AccessKey Alibaba Cloud Anda | xXxXxXx |
Job yang disinkronisasi otomatis menggunakan mode default Broadcast run, di mana setiap node pekerja menjalankan job secara simultan—sesuai dengan perilaku asli Spring. Jika suatu job hanya boleh dijalankan pada satu node, ubah Execution mode-nya menjadi Stand-alone operation di konsol.
Opsi B: Buat job secara manual
Untuk mendaftarkan job satu per satu, buat setiap job di konsol:
Masuk ke Konsol SchedulerX.
Di panel navigasi sebelah kiri, klik Task Management.
Di halaman Task Management, klik Create task.
Atur Task type menjadi SpringSchedule, lalu konfigurasikan parameter lainnya.
Parameter job
| Parameter | Deskripsi |
|---|---|
| Task name | Nama untuk job. |
| Description | Deskripsi singkat untuk pencarian dan manajemen. |
| Application ID | Grup aplikasi tempat job tersebut berada. Pilih dari daftar drop-down. |
| Task type | Jenis job. Atur ke SpringSchedule untuk job Spring. Nilai valid lainnya: Java, Shell, Python, Golang, Http, Node.js, XXL-JOB, DataWorks. |
| spring scheduleConfiguration | Nama kelas lengkap dan nama metode job. |
| Execution mode | Cara job dijalankan di seluruh kluster. Stand-alone operation: satu node pekerja acak menjalankan job. Broadcast run: semua node pekerja menjalankan job secara simultan. |
| Priority | Urutan eksekusi ketika beberapa job dalam aplikasi yang sama dipicu secara bersamaan. Job dengan prioritas lebih tinggi dijalankan terlebih dahulu. Untuk jaminan prioritas lintas node pekerja, lihat Preemptible queues. |
| Task parameters | String opsional yang diteruskan ke job melalui konteks eksekusi. |
Frekuensi pemicu
Jadwal yang ditetapkan di Konsol SchedulerX memiliki prioritas lebih tinggi daripada anotasi @Scheduled di kode Anda. Anotasi tersebut tetap berada di sumber kode, tetapi tidak mengontrol waktu eksekusi.| Parameter | Deskripsi |
|---|---|
| Time type | none: dipicu oleh alur kerja. cron: dijadwalkan dengan ekspresi cron. api: dipicu oleh panggilan API. fixed_rate: dipicu pada interval tetap (> 60 detik). second_delay: dipicu dengan penundaan 1–60 detik. one_time: dipicu sekali pada waktu tertentu. |
| cron expression | Ekspresi cron untuk penjadwalan. Masukkan secara manual atau gunakan generator bawaan. |
| Fixed frequency | Interval dalam detik. Tersedia hanya jika Time type adalah fixed_rate. Nilainya harus lebih besar dari 60. |
| Fixed delay | Penundaan dalam detik (1–60). Tersedia hanya jika Time type adalah second_delay. |
Parameter penjadwalan lanjutan
| Parameter | Deskripsi |
|---|---|
| Time offset | Offset antara waktu data dan waktu pemicu job. Diambil dari konteks eksekusi saat runtime. |
| Time zone | Zona waktu untuk penjadwalan. Pilih negara/wilayah atau offset GMT. |
| Calendar | Jenis kalender bisnis: Workday atau Financial day. |
Konfigurasikan kondisi peringatan dan metode notifikasi. Untuk detailnya, lihat Kontak notifikasi dan grup kontak notifikasi.
Verifikasi koneksi
Jalankan aplikasi Spring Boot Anda.
Masuk ke Konsol SchedulerX.
Di panel navigasi sebelah kiri, klik Application Management.
Periksa kolom Total number of instances untuk aplikasi Anda. Nilai lebih dari 0 menunjukkan koneksi berhasil.

Di panel navigasi sebelah kiri, klik Task Management.
Temukan job Anda dan klik Run once di kolom Operation.
Verifikasi bahwa job dijalankan dengan sukses.
Setelah verifikasi, SchedulerX menyediakan kemampuan tingkat enterprise untuk job Spring Anda, termasuk manajemen dan kontrol visual, kueri log, pelacakan rantai eksekusi, serta peringatan.
FAQ
Mengapa timer Spring asli masih berjalan setelah SchedulerX mengambil alih job Spring terjadwal?
Jika penjadwal kustom ditentukan dalam aplikasi Anda, SchedulerX akan menimpa penjadwal kustom tersebut. Periksa apakah ada kelas yang mengimplementasikan antarmuka org.springframework.scheduling.annotation.SchedulingConfigurer di proyek aplikasi Anda, dan apakah metode setScheduler dari ScheduledTaskRegistrar dipanggil untuk menimpa penjadwal default. Jika kelas tersebut ada atau penjadwal default ditimpa, beri komentar pada kode terkait tersebut.
Bagaimana cara mendapatkan konteks untuk job Spring?
Tambahkan kode berikut ke kode proyek aplikasi Anda untuk mendapatkan konteks:
JobContext jobContext = ContainerFactory.getContainerPool().getContext();Apakah job Spring mengembalikan hasil pemrosesan?
Jika versi agen lebih baru dari 1.10.11, job Spring dapat mengembalikan hasil pemrosesan. Hasil pemrosesan dikembalikan berdasarkan metode penjadwalan yang ditentukan.
@Scheduled(cron = "0/5 * * * * ?")
public ProcessResult helloStandalone1() {
try {
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. start");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. end");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. exception end..");
}
return new ProcessResult(true, "Processing result");
}
@Scheduled(cron = "0/5 * * * * ?")
public String helloStandalone2() {
try {
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. start");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. end");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. exception end..");
}
return "Processing result";
}Penjadwal Spring asli masih berjalan setelah pengambilalihan
Hal ini terjadi ketika aplikasi Anda menentukan penjadwal kustom. Periksa apakah ada kelas yang mengimplementasikan org.springframework.scheduling.annotation.SchedulingConfigurer dan memanggil setScheduler pada ScheduledTaskRegistrar. Jika demikian, beri komentar pada kode tersebut—SchedulerX tidak dapat menimpa penjadwal kustom.
Dapatkan konteks eksekusi
Ambil JobContext melalui ContainerFactory:
JobContext jobContext = ContainerFactory.getContainerPool().getContext();Kembalikan hasil pemrosesan
Memerlukan versi agen lebih baru dari 1.10.11. Dua jenis nilai kembalian didukung:
Kembalikan ProcessResult dengan flag status dan pesan:
@Scheduled(cron = "0/5 * * * * ?")
public ProcessResult helloStandalone1() {
try {
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. start");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. end");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. exception end..");
}
return new ProcessResult(true, "Processing result");
}Kembalikan String biasa:
@Scheduled(cron = "0/5 * * * * ?")
public String helloStandalone2() {
try {
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. start");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. end");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " hello world. exception end..");
}
return "Processing result";
}