All Products
Search
Document Center

SchedulerX:Spring jobs

Last Updated:Mar 11, 2026

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:

  1. Tambahkan dependensi SchedulerX Spring Boot starter ke proyek Anda.

  2. Atur spring.schedulerx2.task.scheduling.scheduler=schedulerx di file application.properties Anda.

  3. SchedulerX mengambil kendali atas semua metode @Scheduled dan 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:

ModePerilakuKasus penggunaan
Broadcast runSetiap 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 operationSatu 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

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=schedulerx

Untuk mendapatkan parameter koneksi (endpoint, namespace, groupId, appKey):

  1. Masuk ke Konsol SchedulerX.

  2. Di panel navigasi sebelah kiri, klik Application Management.

  3. 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:

OpsiPaling cocok untukCara
Auto-sync (direkomendasikan)Jumlah besar @Scheduled job yang sudah adaTambahkan properti konfigurasi (lihat di bawah)
Manual creationKontrol selektif terhadap job individualBuat 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:

PlaceholderDeskripsiContoh
<region-id>Wilayah tempat instans SchedulerX Anda berjalan. Lihat Endpoints.cn-hangzhou
<your-access-key>ID AccessKey Alibaba Cloud AndaLTAI5tXxx
<your-secret-key>Rahasia AccessKey Alibaba Cloud AndaxXxXxXx
Penting

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:

  1. Masuk ke Konsol SchedulerX.

  2. Di panel navigasi sebelah kiri, klik Task Management.

  3. Di halaman Task Management, klik Create task.

  4. Atur Task type menjadi SpringSchedule, lalu konfigurasikan parameter lainnya.

Parameter job
ParameterDeskripsi
Task nameNama untuk job.
DescriptionDeskripsi singkat untuk pencarian dan manajemen.
Application IDGrup aplikasi tempat job tersebut berada. Pilih dari daftar drop-down.
Task typeJenis job. Atur ke SpringSchedule untuk job Spring. Nilai valid lainnya: Java, Shell, Python, Golang, Http, Node.js, XXL-JOB, DataWorks.
spring scheduleConfigurationNama kelas lengkap dan nama metode job.
Execution modeCara job dijalankan di seluruh kluster. Stand-alone operation: satu node pekerja acak menjalankan job. Broadcast run: semua node pekerja menjalankan job secara simultan.
PriorityUrutan 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 parametersString 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.
ParameterDeskripsi
Time typenone: 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 expressionEkspresi cron untuk penjadwalan. Masukkan secara manual atau gunakan generator bawaan.
Fixed frequencyInterval dalam detik. Tersedia hanya jika Time type adalah fixed_rate. Nilainya harus lebih besar dari 60.
Fixed delayPenundaan dalam detik (1–60). Tersedia hanya jika Time type adalah second_delay.
Parameter penjadwalan lanjutan
ParameterDeskripsi
Time offsetOffset antara waktu data dan waktu pemicu job. Diambil dari konteks eksekusi saat runtime.
Time zoneZona waktu untuk penjadwalan. Pilih negara/wilayah atau offset GMT.
CalendarJenis kalender bisnis: Workday atau Financial day.
  1. Konfigurasikan kondisi peringatan dan metode notifikasi. Untuk detailnya, lihat Kontak notifikasi dan grup kontak notifikasi.

Verifikasi koneksi

  1. Jalankan aplikasi Spring Boot Anda.

  2. Masuk ke Konsol SchedulerX.

  3. Di panel navigasi sebelah kiri, klik Application Management.

  4. Periksa kolom Total number of instances untuk aplikasi Anda. Nilai lebih dari 0 menunjukkan koneksi berhasil.

Application Management page showing connected instances
  1. Di panel navigasi sebelah kiri, klik Task Management.

  2. Temukan job Anda dan klik Run once di kolom Operation.

  3. 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";
}