All Products
Search
Document Center

Microservices Engine:Bangun dan integrasikan aplikasi Java/Golang/Python dari awal

Last Updated:Jun 21, 2026

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

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.

yuque_diagram

Solusi ini mencakup langkah-langkah berikut:

  1. Buat aplikasi: Kelola tugas terjadwal secara terpusat untuk menyederhanakan peninjauan, konfigurasi, dan penjadwalan, sehingga meningkatkan efisiensi operasional.

  2. 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.

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

  1. Masuk ke Konsol MSE XXL-JOB dan pilih Wilayah dari bilah menu atas.

  2. 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

Catatan

XXL-JOB mendukung aplikasi yang ditulis dalam Java, Go, dan Python. Untuk informasi selengkapnya, lihat proyek demo open-source XXL-JOB:

Java

  1. Konfigurasikan lingkungan: Tambahkan dependensi Maven untuk xxl-job-core di 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>
  2. 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;
        }
    }
  3. Tulis kode eksekusi tugas (menggunakan versi 2.2.x sebagai contoh).

    Catatan

    Antarmuka 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

  1. 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}
  2. 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
        }
    }
  3. 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

  1. 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]"
  2. 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.

Penting

Kluster Container Service harus berada dalam VPC yang sama dengan kluster SchedulerX XXL-JOB.

  1. 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]
  2. 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
  3. Di panel navigasi kiri, buka halaman dan klik Access Configuration di kolom Actions untuk aplikasi target Anda.

  4. 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.

  1. 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.

  2. 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.

  3. Konfigurasikan Notifications. Anda dapat mengatur peringatan timeout, notifikasi sukses, peringatan kegagalan, metode notifikasi, dan penerima notifikasi. Contoh ini menggunakan pengaturan default konsol.

  4. Setelah pembuatan, klik Run Once di kolom Actions untuk tugas Anda. Di dialog eksekusi manual, tentukan Target Machine, konfigurasikan Instance Parameters, lalu klik OK.

  5. Klik More 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.

  6. 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.

  1. 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.

  2. 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.

  3. Konfigurasikan Notifications. Anda dapat mengatur peringatan timeout, notifikasi sukses, peringatan kegagalan, metode notifikasi, dan penerima notifikasi. Contoh ini menggunakan pengaturan default konsol.

  4. Setelah pembuatan, klik Run Once di kolom Actions untuk tugas Anda. Di dialog eksekusi manual, tentukan Target Machine, konfigurasikan Instance Parameters, lalu klik OK.

  5. Klik More untuk melihat catatan eksekusi tugas.

  6. 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.

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