Aplikasi yang menggunakan sistem penjadwalan tugas self-managed berbasis open source XXL-JOB mungkin menghadapi tantangan seperti konfigurasi tugas yang kompleks, efisiensi eksekusi rendah, serta pemantauan dan manajemen yang sulit. Alibaba Cloud menyediakan solusi open source yang mendukung penjadwalan tugas terjadwal dan sharding tugas, membantu Anda menghubungkan tugas terjadwal self-managed ke platform penjadwalan tugas dengan cepat.
Prasyarat
-
Tambahkan izin RAM yang diperlukan untuk XXL-JOB ke Pengguna RAM Anda. Untuk informasi selengkapnya, lihat Otorisasi XXL-JOB di SchedulerX.
-
Buat instans XXL-JOB. Untuk informasi selengkapnya, lihat Buat instans.
Ikhtisar solusi
Solusi ini menjelaskan cara menggunakan SDK untuk menghubungkan aplikasi Java, Go, atau Python ke MSE-XXLJOB serta menjadwalkan dan mengeksekusi tugas terjadwal.
Implementasikan logika tugas terjadwal Anda dalam kode dan ekspos sebagai komponen tugas berlabel Bean. Di Konsol, konfigurasikan nama Bean untuk memicu logika tugas yang sesuai.

Solusi ini mencakup langkah-langkah berikut:
-
Buat aplikasi: Kelola tugas terjadwal secara terpusat untuk menyederhanakan peninjauan, konfigurasi, dan penjadwalan, sehingga meningkatkan efisiensi operasional.
-
Kembangkan dan terapkan aplikasi: Tulis kode tugas terjadwal, bangun image Docker, dan unggah ke repository image Alibaba Cloud untuk mengaktifkan manajemen dan penerapan berbasis kontainer.
-
Uji dan verifikasi: Pastikan aplikasi yang terhubung dapat dijadwalkan dan dikelola secara otomatis di platform XXL-JOB, serta tugas dieksekusi secara akurat dan tepat waktu.
Langkah 1: Buat aplikasi
-
Masuk ke Konsol MSE XXL-JOB dan pilih Wilayah dari bilah menu atas.
-
Klik instans target untuk membuka halaman detailnya. Di panel navigasi kiri, pilih dan klik Create Application. Masukkan AppName dan Name, gunakan AccessToken yang dihasilkan sistem, lalu klik OK.
Langkah 2: Kembangkan dan terapkan aplikasi
1. Kembangkan tugas XXL-JOB
XXL-JOB mendukung aplikasi yang ditulis dalam Java, Go, dan Python. Untuk informasi selengkapnya, lihat proyek demo open-source XXL-JOB:
-
Go: xxl-job-executor-go.
-
Python: xxl-job-executor-python.
Java
-
Konfigurasikan lingkungan: Tambahkan dependensi Maven untuk
xxl-job-coredi file pom.xml Anda. Untuk detail versi, lihat xxl-job-executor-sample-springboot.<!-- xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.x</version> </dependency> -
Lakukan inisialisasi executor.
@Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appname; @Value("${xxl.job.executor.address}") private String address; @Value("${xxl.job.executor.ip}") private String ip; @Value("${xxl.job.executor.port}") private int port; @Value("${xxl.job.executor.logpath}") private String logPath; @Value("${xxl.job.executor.logretentiondays}") private int logRetentionDays; @Bean public XxlJobSpringExecutor xxlJobExecutor() { logger.info(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setAddress(address); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } } -
Tulis kode eksekusi tugas (menggunakan versi 2.2.x sebagai contoh).
CatatanAntarmuka berbeda-beda antar versi XXL-JOB. Lihat proyek demo open source untuk detailnya.
@Component public class SampleXxlJob { private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class); @XxlJob("helloworld") public ReturnT<String> helloworld(String param) throws Exception { XxlJobLogger.log("XXL-JOB, Hello World, start..."); for (int i = 0; i < 5; i++) { XxlJobLogger.log("beat at:" + i); TimeUnit.SECONDS.sleep(2); } System.out.println("XXL-JOB, Hello World, finished"); return ReturnT.SUCCESS; } }
Golang
-
Konfigurasikan lingkungan: Jalankan perintah berikut untuk menarik versi bertag terbaru dari SDK Go untuk XXL-JOB. Untuk detail versi, lihat xxl-job-executor-go.
go get github.com/xxl-job/xxl-job-executor-go@{latest tag} -
Tulis kode inisialisasi executor.
package main import ( "context" "fmt" xxl "github.com/xxl-job/xxl-job-executor-go" "github.com/xxl-job/xxl-job-executor-go/example/task" "log" ) func main() { exec := xxl.NewExecutor( xxl.ServerAddr("xxxxxx"), // URL permintaan, diperoleh dari Konsol di Application Management > Access Configuration xxl.AccessToken("xxxxxxx"), // Token akses, diperoleh dari Konsol di Application Management > Access Configuration xxl.ExecutorPort("9999"), // Default adalah 9999 (opsional) xxl.RegistryKey("golang-jobs"), // Nama executor xxl.SetLogger(&logger{}), // Logger kustom ) exec.Init() exec.Use(customMiddleware) // Atur penanganan peninjauan log exec.LogHandler(customLogHandle) // Daftarkan penanganan tugas exec.RegTask("task.test", task.Test) exec.RegTask("task.shardingTest", task.ShardingTest) log.Fatal(exec.Run()) } // Penanganan log kustom func customLogHandle(req *xxl.LogReq) *xxl.LogRes { return &xxl.LogRes{Code: xxl.SuccessCode, Msg: "", Content: xxl.LogResContent{ FromLineNum: req.FromLineNum, ToLineNum: 2, LogContent: "This is a custom log handler", IsEnd: true, }} } // Implementasi antarmuka xxl.Logger type logger struct{} func (l *logger) Info(format string, a ...interface{}) { fmt.Println(fmt.Sprintf("Custom log - "+format, a...)) } func (l *logger) Error(format string, a ...interface{}) { log.Println(fmt.Sprintf("Custom log - "+format, a...)) } // Middleware kustom func customMiddleware(tf xxl.TaskFunc) xxl.TaskFunc { return func(cxt context.Context, param *xxl.RunReq) string { log.Println("I am a middleware start") res := tf(cxt, param) log.Println("I am a middleware end") return res } } -
Tulis kode eksekusi tugas.
package task import ( "context" "fmt" xxl "github.com/xxl-job/xxl-job-executor-go" ) func Test(cxt context.Context, param *xxl.RunReq) (msg string) { fmt.Println("test one task" + param.ExecutorHandler + " param: " + param.ExecutorParams + " log_id:" + xxl.Int64ToStr(param.LogID)) return "test done" } func ShardingTest(cxt context.Context, param *xxl.RunReq) (msg string) { fmt.Println("shardingId:" + xxl.Int64ToStr(param.BroadcastIndex) + ", shardingTotal:" + xxl.Int64ToStr(param.BroadcastTotal)) return "ShardingTest done" }
Python
-
Instal dependensi. Untuk detail versi, lihat xxl-job-executor-python.
pip install pyxxl # Jika log perlu ditulis ke Redis pip install "pyxxl[redis]" # Jika memuat konfigurasi dari .env pip install "pyxxl[dotenv]" # Instal semua fitur pip install "pyxxl[all]" -
Tulis kode eksekusi tugas.
import asyncio import time from pyxxl import ExecutorConfig, PyxxlRunner from pyxxl.ctx import g config = ExecutorConfig( xxl_admin_baseurl="http://xxljob-1b3fd81****.schedulerx.mse.aliyuncs.com/api/", executor_app_name="xueren-test", access_token="default_token", # executor_listen_host="0.0.0.0", # Abaikan jika xxl-admin dapat langsung terhubung ke IP executor ) app = PyxxlRunner(config) @app.register(name="demoJobHandler") async def test_task(): # Anda dapat memperoleh parameter tugas menggunakan "g" g.logger.info("get executor params: %s" % g.xxl_run_data.executorParams) for i in range(10): g.logger.warning("test logger %s" % i) await asyncio.sleep(5) return "Success..." @app.register(name="sync_func") def test_task4(): # Untuk melihat log eksekusi di xxl-admin, selalu gunakan g.logger (secara default mencatat level info ke atas) n = 1 g.logger.info("Job %s get executor params: %s" % (g.xxl_run_data.jobId, g.xxl_run_data.executorParams)) # Pada tugas sinkron dengan loop, periksa g.cancel_event setiap iterasi untuk mendukung pembatalan while n <= 10 and not g.cancel_event.is_set(): # Gunakan logger Anda sendiri jika log tidak perlu muncul di xxl-admin g.logger.info( "log to {} logger test_task4.{},params:{}".format( g.xxl_run_data.jobId, n, g.xxl_run_data.executorParams, ) ) time.sleep(2) n += 1 return "Success3" if __name__ == "__main__": app.run_executor()
2. Terapkan aplikasi ke Alibaba Cloud
Alibaba Cloud XXL-JOB hanya mendukung jaringan Alibaba Cloud. Anda harus menerapkan aplikasi Anda di Alibaba Cloud. Contoh berikut menunjukkan cara menerapkan aplikasi Java ke Container Service for Kubernetes.
Kluster Container Service harus berada dalam VPC yang sama dengan kluster SchedulerX XXL-JOB.
-
Buat Dockerfile di direktori root aplikasi Spring Boot Anda.
# Ganti dengan image dasar Anda sendiri FROM reg.docker.alibaba-inc.com/xxx/xxxx-java:1.0-beta MAINTAINER xueren ENV JAVA_OPTS="" ADD target/xxl-job-executor-sample-springboot-*.jar /app.jar ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar] -
Gunakan Docker untuk membangun image dan dorong ke repository image Alibaba Cloud.
docker login --username=xxx@aliyun.com registry.cn-hangzhou.aliyuncs.com --password=xxxxxx docker buildx build --platform linux/amd64 -t schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx3/xxljob-demo:2.4.1 . docker push schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx3/xxljob-demo:2.4.1 -
Di panel navigasi kiri, buka halaman dan klik Access Configuration di kolom Actions untuk aplikasi target Anda.
-
Masuk ke Container Service Alibaba Cloud dan buka kluster target Anda. Di panel navigasi kiri, pilih dan klik Create Resource Using YAML di pojok kanan atas untuk membuat Deployment. Contoh berikut menggunakan metode akses 2 (me-restart aplikasi dengan parameter -D). Ganti nilai JAVA_OPTS dalam YAML untuk menyuntikkan parameter JVM melalui variabel lingkungan.
apiVersion: apps/v1 kind: Deployment metadata: name: xxljob-xueren-test labels: app: xxljob-xueren-test spec: replicas: 2 selector: matchLabels: app: xxljob-xueren-test template: metadata: labels: app: xxljob-xueren-test spec: containers: - name: xxljob-executor image: schedulerx-registry.cn-hangzhou.cr.aliyuncs.com/schedulerx3/xxljob-demo:2.4.1 ports: - containerPort: 9999 env: - name: JAVA_OPTS value: >- -Dxxl.job.admin.addresses=http://xxljob-xxxxx.schedulerx.mse.aliyuncs.com -Dxxl.job.executor.appname=xueren_test -Dxxl.job.accessToken=xxxxxxx
Langkah 3: Uji dan verifikasi
1. Verifikasi koneksi executor
Buka halaman detail instans, klik Application Management di panel navigasi kiri, lalu klik jumlah executor untuk aplikasi target Anda guna melihat alamat executor yang terhubung dan status online-nya.
2. Pengujian dan verifikasi tugas
Pengujian tugas single-node
Tugas single-node dijalankan sekali per eksekusi pada satu executor yang dipilih dari semua executor untuk aplikasi tersebut, berdasarkan kebijakan perutean.
-
Di panel navigasi kiri, pilih Task Management dan klik Add Task. Lengkapi konfigurasi dasar: masukkan Task Name dan jobHandler name, pilih aplikasi target untuk Associated Application, pilih Round Robin untuk Routing Policy, lalu klik Next.
Atur Task Type ke BEAN, Blocking Handling Policy ke Serial Execution on Single Node, dan Priority ke Medium.
-
Konfigurasikan Scheduling Settings. Pilih cron untuk Time Type dan klik Use Generator untuk menghasilkan cron expression. Contoh ini dijalankan sekali sehari pukul 12:00. Klik Next.
Masukkan
0 0 12 * * ?di bidang cron expression. -
Konfigurasikan Notifications. Anda dapat mengatur peringatan timeout, notifikasi sukses, peringatan kegagalan, metode notifikasi, dan penerima notifikasi. Contoh ini menggunakan pengaturan default konsol.
-
Setelah pembuatan, klik Run Once di kolom Actions untuk tugas Anda. Di dialog eksekusi manual, tentukan Target Machine, konfigurasikan Instance Parameters, lalu klik OK.
-
Klik untuk melihat catatan eksekusi tugas.
Daftar eksekusi menampilkan catatan tugas, termasuk Execution ID, Task ID/Name, Application, Start Time, End Time, Status, dan Actions. Untuk catatan dengan status Success, Anda dapat melihat Details dan Logs. Untuk catatan Failed, Anda juga dapat Rerun.
-
Di panel navigasi kiri, klik Execution List, lalu klik Log di kolom Actions untuk catatan eksekusi target Anda guna melihat log eksekusi tugas.
2024-08-21 12:00:00 [com.xxl.job.core.thread.JobThread#run]-[124]-[Thread-10] ----------- xxl-job job execute start ----------- ----------- Param:123456 2024-08-21 12:00:00 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#helloworld]-[38]-[Thread-10] XXL-JOB, Hello World, 2024-08-21 12:00:00 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#helloworld]-[40]-[Thread-10] beat at:0 2024-08-21 12:00:02 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#helloworld]-[40]-[Thread-10] beat at:1 2024-08-21 12:00:04 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#helloworld]-[40]-[Thread-10] beat at:2 2024-08-21 12:00:06 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#helloworld]-[40]-[Thread-10] beat at:3 2024-08-21 12:00:08 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#helloworld]-[40]-[Thread-10] beat at:4 2024-08-21 12:00:10 [com.xxl.job.core.thread.JobThread#run]-[164]-[Thread-10] ----------- xxl-job job execute end(finish) ----------- ----------- ReturnT:ReturnT [code=200, msg=null, content=null] 2024-08-21 12:00:10 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[191]-[xxl-job, executor TriggerCallbackThread] ----------- xxl-job job callback finish.
Pengujian tugas sharded broadcast
Tugas sharded broadcast dieksekusi pada semua executor untuk aplikasi tersebut setiap kali dijalankan. Setiap executor menerima nomor shard unik, memungkinkan pemrosesan batch terdistribusi. XXL-JOB open source tidak memiliki agregasi untuk sharded broadcast, tetapi Alibaba Cloud XXL-JOB mengagregasi dan menampilkan semua hasil shard untuk setiap eksekusi.
-
Di panel navigasi kiri, pilih Task Management dan klik Add Task. Lengkapi konfigurasi dasar: masukkan Task Name dan jobHandler name, pilih aplikasi target untuk Associated Application, pilih Sharded Broadcast untuk Routing Policy, lalu klik Next.
-
Konfigurasikan Scheduling Settings. Pilih cron untuk Time Type dan klik Use Generator untuk menghasilkan cron expression. Contoh ini dijalankan sekali setiap jam pada menit ke-10. Klik Next.
Masukkan
0 10 * * * ?di bidang cron expression. -
Konfigurasikan Notifications. Anda dapat mengatur peringatan timeout, notifikasi sukses, peringatan kegagalan, metode notifikasi, dan penerima notifikasi. Contoh ini menggunakan pengaturan default konsol.
-
Setelah pembuatan, klik Run Once di kolom Actions untuk tugas Anda. Di dialog eksekusi manual, tentukan Target Machine, konfigurasikan Instance Parameters, lalu klik OK.
-
Klik untuk melihat catatan eksekusi tugas.
-
Di panel navigasi kiri, klik Execution List. Di halaman daftar eksekusi tugas, klik Details di kolom Actions untuk catatan eksekusi target Anda. Bagian Shard Details mengagregasi status eksekusi untuk setiap mesin.
Hasil eksekusi menunjukkan kemajuan keseluruhan 100%, dengan kedua shard (shard 0 dan shard 1) berhasil.
-
Untuk setiap shard, klik Log di kolom Actions untuk melihat log eksekusi.
2024-08-21 12:00:00 [com.xxl.job.core.thread.JobThread#run]-[124]-[Thread-10] ----------- xxl-job job execute start ----------- ----------- Param: 2024-08-21 12:00:00 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#shardingJobHandler]-[74]-[Thread-10] Shard parameters: total xxx 2024-08-21 12:00:00 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#shardingJobHandler]-[79]-[Thread-10] Shard 0, processing xxx 2024-08-21 12:00:00 [com.xxl.job.executor.service.jobhandler.SampleXxlJob#shardingJobHandler]-[81]-[Thread-10] Shard 1, skipping xxx 2024-08-21 12:00:00 [com.xxl.job.core.thread.JobThread#run]-[164]-[Thread-10] ----------- xxl-job job execute end(finish) ----------- ----------- ReturnT:ReturnT [code=200, msg=null, content=null] 2024-08-21 12:00:00 [com.xxl.job.core.thread.TriggerCallbackThread#callbackLog]-[191]-[xxl-job, executor TriggerCallbackThxxx] ----------- xxl-job job callback finish.