Tugas Spring yang dijadwalkan memfasilitasi penerapan tugas terjadwal dalam sistem Java, tetapi memiliki beberapa batasan dalam skenario perusahaan. Tugas Spring yang dikelola oleh SchedulerX dapat memenuhi lebih banyak kebutuhan dalam skenario tersebut.
Prasyarat
Versi klien adalah 1.8.13 atau lebih baru.
Aplikasi Spring Boot Anda harus terhubung ke SchedulerX. Untuk informasi lebih lanjut, lihat Hubungkan aplikasi Spring Boot ke SchedulerX.
Prosedur Koneksi
Langkah 1: Tambahkan dependensi ke file pom.xml
Tambahkan dependensi dan kelas utama ke file pom.xml aplikasi. Dalam contoh ini, aplikasi Spring Boot digunakan.
Ganti schedulerx2.version dengan versi terbaru dari Agen SchedulerX. Untuk informasi lebih lanjut, lihat Catatan Rilis Agen.
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${schedulerx2.version}</version>
<!-- Jika Anda menggunakan Logback, Anda harus mengecualikan Log4j dan Log4j2. -->
<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>Baik Anda menggunakan tugas Spring terjadwal untuk pertama kalinya atau sudah pernah menggunakannya, pastikan untuk mengaktifkan anotasi @EnableScheduling di kelas utama. Berikut adalah contoh kode:
@SpringBootApplication
@EnableScheduling /**Aktifkan tugas Spring terjadwal.*/
public class SchedulerXWorkerApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulerXWorkerApplication.class, args);
}
}
/** Kelas tugas Spring terjadwal asli*/
@Service
public class SpringScheduledProcessor {
@Scheduled(cron = "0/2 * * * * ?")
public void hello() {
logger.info(DateUtil.now() + " halo dunia. mulai");
logger.info(DateUtil.now() + " halo dunia. selesai");
}
}SchedulerX tidak akan secara default mengambil alih tugas Spring terjadwal yang ada di aplikasi, baik pada penggunaan pertama kali maupun setelahnya. Tugas-tugas tersebut tetap dijadwalkan oleh kontainer Spring, dan eksekusinya tidak akan terpengaruh.
Langkah 2: Tambahkan konfigurasi parameter
Untuk memungkinkan SchedulerX mengambil alih tugas Spring terjadwal, tambahkan konfigurasi berikut ke file Properties.
# 1. Konfigurasikan akses aplikasi.
spring.schedulerx2.endpoint=${endpoint}
spring.schedulerx2.namespace=${namespace}
spring.schedulerx2.groupId=${groupId}
spring.schedulerx2.appKey=${appKey}
# 2. Aktifkan SchedulerX untuk mengambil alih tugas Spring terjadwal.
spring.schedulerx2.task.scheduling.scheduler=schedulerx
# 3. Setelah Anda mengizinkan SchedulerX mengambil alih tugas Spring terjadwal, Anda dapat mengaktifkan sinkronisasi tugas otomatis. Parameter berikut bersifat opsional.
#spring.schedulerx2.task.scheduling.sync=true
# spring.schedulerx2.regionId=ID wilayah tempat Anda ingin menyinkronkan tugas (Untuk informasi lebih lanjut tentang ID wilayah, lihat Titik akhir.)
#spring.schedulerx2.aliyunAccessKey=XXXXXXXXX
#spring.schedulerx2.aliyunSecretKey=XXXXXXXXXInstruksi konfigurasi:
Konfigurasikan akses aplikasi: Masuk ke konsol MSE dan buka halaman Versi SchedulerX. Di panel navigasi sisi kiri, klik Applications. Pada halaman Aplikasi, temukan aplikasi yang ingin Anda kelola dan klik Konfigurasi Akses di kolom Operation untuk melihat informasi konfigurasi akses. Jika Anda menghubungkan tugas Spring ke SchedulerX untuk pertama kalinya, Anda harus membuat aplikasi untuk tugas tersebut.
Aktifkan sinkronisasi otomatis tugas yang ada: Jika Anda sudah menggunakan tugas Spring terjadwal dan memiliki sejumlah besar tugas terjadwal yang ada, Anda dapat mengaktifkan sinkronisasi otomatis tugas di file konfigurasi aplikasi. Ini menghilangkan kebutuhan untuk operasi pembuatan tugas manual seperti yang dijelaskan di Langkah 3. Untuk informasi lebih lanjut tentang ID wilayah, lihat Titik Akhir.
Untuk menjamin bahwa tugas yang disinkronkan otomatis mengikuti pola eksekusi yang identik dengan tugas Spring asli dalam kluster, sistem secara default menetapkan parameter Mode Eksekusi ke Broadcast run. Konfigurasi ini memastikan bahwa setiap node pekerja dalam kluster menjalankan tugas secara bersamaan pada titik waktu yang ditentukan. Jika tugas perlu dijalankan pada node pekerja tertentu dalam kluster, Anda dapat langsung menetapkan parameter Mode Eksekusi untuk tugas tersebut ke Stand-alone operation di konsol SchedulerX. Untuk informasi lebih lanjut tentang parameter, lihat Langkah 3.
Langkah 3: (Opsional) Buat tugas terjadwal secara manual
Jika Anda mengaktifkan sinkronisasi tugas otomatis di Langkah 2, Anda tidak perlu membuat tugas terjadwal secara manual.
Masuk ke konsol MSE, dan buka halaman Versi SchedulerX.
Di panel navigasi sisi kiri, klik Tasks.
Pada halaman Tasks, klik Create task. Di panel Buat tugas, pilih SpringSchedule dari daftar drop-down Jenis Tugas, dan masukkan nama kelas dan nama metode.
Parameter
Deskripsi
Task name
Nama tugas yang ingin Anda buat.
Description
Deskripsi tugas. Tentukan deskripsi yang ringkas dan jelas untuk memudahkan pencarian dan pengelolaan tugas.
Application ID
Grup tempat tugas termasuk. Pilih nilai dari daftar drop-down.
Task type
Bahasa pemrograman yang ingin Anda gunakan untuk membuat tugas. Nilai valid termasuk Java, Shell, Python, Golang, Http, Node.js, XXL-JOB, dan DataWorks. Saat Anda memilih Shell, Python, atau Golang, editor akan ditampilkan. Anda dapat memasukkan skrip di editor.
Dalam contoh ini, parameter ini diatur ke SpringSchedule.
spring scheduleConfiguration
Nama kelas lengkap dan nama metode tugas.
Execution mode
Mode di mana tugas dijalankan. Mode eksekusi berikut didukung:
Operasi mandiri: Tugas dijalankan pada pekerja acak.
Penyiaran: Tugas dijalankan secara bersamaan pada semua pekerja, dan sistem menunggu hingga semua pekerja menyelesaikan tugas.
CatatanParameter di bagian Konfigurasi Lanjutan bervariasi berdasarkan mode eksekusi yang dipilih.
Priority
Jika beberapa tugas dari aplikasi yang sama berjalan pada pekerja yang sama pada saat yang sama, tugas dengan prioritas tinggi dijalankan terlebih dahulu. Namun, jika beberapa tugas dari aplikasi yang sama berjalan pada beberapa pekerja, tugas dengan prioritas berbeda dijadwalkan ke pekerja yang berbeda. Dalam hal ini, tugas dengan prioritas rendah mungkin dijalankan terlebih dahulu. SchedulerX menggunakan antrian preemptible untuk menghindari masalah ini dan memastikan bahwa tugas dengan prioritas lebih tinggi dalam antrian dipicu terlebih dahulu. Untuk informasi lebih lanjut, lihat Lakukan throttling tingkat aplikasi berdasarkan prioritas tugas dalam antrian.
Task parameters
String acak yang dapat diperoleh dari konteks saat SchedulerX menjalankan tugas.
Konfigurasikan frekuensi pemicu.
CatatanFrekuensi yang ditentukan di konsol SchedulerX berlaku, dan konfigurasi anotasi asli
@Scheduleddalam kode tugas Spring terjadwal menjadi tidak valid. Namun, anotasi tersebut tetap ada di kode.Tabel berikut menjelaskan parameter.
Parameter
Deskripsi
Time type
none: Tugas dipicu menggunakan alur kerja.
cron: Tugas dijadwalkan berdasarkan ekspresi cron.
api: Tugas dipicu dengan memanggil operasi API.
fixed_rate: Tugas dipicu pada interval tertentu.
second_delay: Tugas dipicu dengan penundaan dari 1 hingga 60 detik.
one_time: Tugas hanya dipicu sekali pada titik waktu yang ditentukan.
cron expression
Ekspresi cron berdasarkan mana tugas dijadwalkan. Anda dapat memasukkan ekspresi cron secara manual berdasarkan sintaks cron. Anda juga dapat menggunakan alat yang disediakan oleh SchedulerX untuk menghasilkan ekspresi cron yang valid secara otomatis.
Fixed frequency
Interval di mana tugas dipicu. Parameter ini tersedia hanya jika parameter Jenis Tugas diatur ke fixed_rate. Nilainya harus lebih besar dari 60. Unit: detik. Misalnya, nilai 200 menunjukkan bahwa tugas dipicu pada interval 200 detik.
Fixed delay
Penundaan tetap. Parameter ini tersedia hanya jika parameter Jenis Tugas diatur ke second_delay. Nilai valid: 1 hingga 60. Unit: detik. Misalnya, nilai 5 menunjukkan bahwa tugas dipicu dengan penundaan 5 detik.
Tabel berikut menjelaskan konfigurasi penjadwalan lanjutan.
Parameter
Deskripsi
Time offset
Tentukan offset antara timestamp data yang akan diproses dan waktu ketika tugas dipicu. Anda dapat memperoleh nilai offset dari konteks saat SchedulerX menjalankan tugas.
Time zone
Pilih zona waktu negara atau wilayah atau pilih zona waktu GMT berdasarkan kebutuhan bisnis Anda.
Calendar
Pilih Hari Kerja atau Hari Keuangan.
Konfigurasikan kondisi peringatan dan metode notifikasi. Untuk informasi lebih lanjut tentang metode notifikasi, lihat Kontak Notifikasi dan Grup Kontak Notifikasi.
Setelah Anda menyelesaikan konfigurasi, SchedulerX dapat menjalankan tugas Spring terjadwal. Konsol juga memberikan kemampuan O&M tingkat perusahaan kepada tugas Spring asli, termasuk manajemen dan kontrol visual, kueri log tugas, tampilan rantai eksekusi, serta notifikasi dan peringatan eksekusi tugas.
Langkah 4: Verifikasi akses aplikasi
Mulai aplikasi Spring. Masuk ke konsol MSE dan buka halaman Versi SchedulerX. Di panel navigasi sisi kiri, klik Applications. Pada halaman Aplikasi, periksa nilai di kolom Total jumlah instance untuk aplikasi. Jika nilainya lebih besar dari 0, aplikasi terhubung ke SchedulerX.
Di panel navigasi sisi kiri, klik Tasks. Pada halaman yang muncul, temukan tugas yang sesuai dengan aplikasi dan klik Run once di kolom Operation. Konfigurasi berlaku jika tugas berhasil dijalankan.
FAQ
Mengapa timer Spring asli masih berjalan setelah SchedulerX mengambil alih tugas Spring terjadwal?
Jika penjadwal kustom ditentukan dalam aplikasi Anda, SchedulerX menimpa penjadwal kustom. Periksa apakah kelas yang mengimplementasikan antarmuka org.springframework.scheduling.annotation.SchedulingConfigurer ada di proyek aplikasi Anda, dan apakah metode setScheduler dari ScheduledTaskRegistrar dipanggil untuk menimpa penjadwal default. Jika kelas tersebut ada atau penjadwal default ditimpa, komentari kode terkait.
Bagaimana cara mendapatkan konteks untuk tugas Spring?
Tambahkan kode berikut ke kode proyek aplikasi Anda untuk mendapatkan konteks:
JobContext jobContext = ContainerFactory.getContainerPool().getContext();Apakah tugas Spring mengembalikan hasil pemrosesan?
Jika versi agen lebih baru dari 1.10.11, tugas 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() + " halo dunia. mulai");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " halo dunia. selesai");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " halo dunia. pengecualian selesai..");
}
return new ProcessResult(true, "Hasil pemrosesan");
}
@Scheduled(cron = "0/5 * * * * ?")
public String helloStandalone2() {
try {
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " halo dunia. mulai");
TimeUnit.SECONDS.sleep(2L);
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " halo dunia. selesai");
} catch (Exception e) {
e.printStackTrace();
logger.info(DateUtil.now() + " " + Thread.currentThread().getName() + " halo dunia. pengecualian selesai..");
}
return "Hasil pemrosesan";
}