Las aplicaciones que utilizan un sistema de programación de tareas autogestionado basado en el proyecto de código abierto XXL-JOB pueden enfrentar dificultades como configuraciones complejas, baja eficiencia de ejecución y complicaciones en el monitoreo y la gestión. Alibaba Cloud ofrece una solución de código abierto compatible con la programación de tareas y el sharding de tareas, lo que le permite conectar rápidamente sus tareas programadas autogestionadas a una plataforma de programación centralizada.
Requisitos previos
Agregue los permisos de RAM necesarios para XXL-JOB a su usuario de RAM. Para obtener más información, consulte Authorize XXL-JOB in SchedulerX.
Cree una instancia de XXL-JOB. Para obtener más información, consulte Create an instance.
Descripción general de la solución
Esta solución describe cómo utilizar el SDK para conectar aplicaciones Java, Go o Python a MSE-XXLJOB, así como para programar y ejecutar tareas programadas.
Implemente la lógica de sus tareas programadas en el código y expóngala como un componente de tarea etiquetado como Bean. En la consola, configure el nombre del Bean para activar la lógica de la tarea correspondiente.

Esta solución incluye los siguientes pasos:
Crear una aplicación: Gestione las tareas programadas de forma centralizada para simplificar su visualización, configuración y programación, mejorando así la eficiencia operativa.
Desarrollar y desplegar la aplicación: Escriba el código de la tarea programada, compile una imagen de Docker y cárguela en un repositorio de imágenes de Alibaba Cloud para habilitar la gestión y el despliegue en contenedores.
Probar y verificar: Confirme que la aplicación conectada se puede programar y gestionar automáticamente en la plataforma XXL-JOB, y que las tareas se ejecutan con precisión y puntualidad.
Paso 1: Crear una aplicación
Inicie sesión en la consola de MSE XXL-JOB y seleccione una región en la barra de menú superior.
Haga clic en la instancia deseada para ir a su página de detalles. En el panel de navegación izquierdo, seleccione y haga clic en Create Application. Introduzca un AppName y un Name, utilice el AccessToken generado por el sistema y haga clic en OK.
Paso 2: Desarrollar y desplegar la aplicación
1. Desarrollar una tarea de XXL-JOB
XXL-JOB admite aplicaciones escritas en Java, Go y Python. Para obtener más información, consulte el proyecto de demostración de código abierto de XXL-JOB:
Go: xxl-job-executor-go.
Python: xxl-job-executor-python.
Java
-
Configure el entorno: Agregue la dependencia de Maven para
xxl-job-coreen su archivo pom.xml. Para obtener detalles sobre la versión, consulte xxl-job-executor-sample-springboot.<!-- xxl-job-core --> <dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.2.x</version> </dependency> -
Inicialice el ejecutor.
@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; } } -
Escriba el código de ejecución de la tarea (se toma la versión 2.2.x como ejemplo).
NotaLas interfaces varían según la versión de XXL-JOB. Consulte el proyecto de demostración de código abierto para obtener más detalles.
@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
-
Configure el entorno: Ejecute el siguiente comando para obtener la última versión etiquetada del SDK de Go para XXL-JOB. Para obtener detalles sobre la versión, consulte xxl-job-executor-go.
go get github.com/xxl-job/xxl-job-executor-go@{latest tag} -
Escriba el código de inicialización del ejecutor.
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"), // Request URL, obtained from the console under Application Management > Access Configuration xxl.AccessToken("xxxxxxx"), // Access token, obtained from the console under Application Management > Access Configuration xxl.ExecutorPort("9999"), // Default is 9999 (optional) xxl.RegistryKey("golang-jobs"), // Executor name xxl.SetLogger(&logger{}), // Custom logger ) exec.Init() exec.Use(customMiddleware) // Set log viewing handler exec.LogHandler(customLogHandle) // Register task handlers exec.RegTask("task.test", task.Test) exec.RegTask("task.shardingTest", task.ShardingTest) log.Fatal(exec.Run()) } // Custom log handler 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, }} } // Implementation of xxl.Logger interface 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...)) } // Custom middleware 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 } } -
Escriba el código de ejecución de la tarea.
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
-
Instale las dependencias. Para obtener detalles sobre la versión, consulte xxl-job-executor-python.
pip install pyxxl # If logs need to be written to Redis pip install "pyxxl[redis]" # If loading configuration from .env pip install "pyxxl[dotenv]" # Install all features pip install "pyxxl[all]" -
Escriba el código de ejecución de la tarea.
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", # Omit if xxl-admin can directly connect to the executor's IP ) app = PyxxlRunner(config) @app.register(name="demoJobHandler") async def test_task(): # You can get task parameters using "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(): # To view execution logs in xxl-admin, always use g.logger (logs info level and above by default) n = 1 g.logger.info("Job %s get executor params: %s" % (g.xxl_run_data.jobId, g.xxl_run_data.executorParams)) # In synchronous tasks with loops, check g.cancel_event each iteration to support cancellation while n <= 10 and not g.cancel_event.is_set(): # Use your own logger if logs don't need to appear in 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. Desplegar la aplicación en Alibaba Cloud
XXL-JOB de Alibaba Cloud solo es compatible con redes de Alibaba Cloud. Debe desplegar su aplicación en Alibaba Cloud. El siguiente ejemplo muestra cómo desplegar una aplicación Java en Container Service for Kubernetes.
El clúster de Container Service debe residir en la misma VPC que el clúster de SchedulerX XXL-JOB.
-
Cree un Dockerfile en el directorio raíz de su aplicación Spring Boot.
# Replace with your own base image 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] -
Utilice Docker para compilar la imagen y enviarla al repositorio de imágenes de 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 En el panel de navegación izquierdo, vaya a la página de y haga clic en Access Configuration en la columna Actions correspondiente a la aplicación deseada.
-
Inicie sesión en Alibaba Cloud Container Service y vaya al clúster deseado. En el panel de navegación izquierdo, seleccione y haga clic en Create Resource Using YAML en la esquina superior derecha para crear un Deployment. El siguiente ejemplo utiliza el método de acceso 2 (reiniciar la aplicación con parámetros -D). Reemplace el valor de JAVA_OPTS en el YAML para inyectar parámetros de JVM mediante variables de entorno.
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
Paso 3: Probar y verificar
1. Verificar la conexión del ejecutor
Vaya a la página de detalles de la instancia, haga clic en Application Management en el panel de navegación izquierdo y luego haga clic en el recuento de ejecutores de la aplicación deseada para ver las direcciones de los ejecutores conectados y su estado en línea.
2. Prueba y verificación de tareas
Prueba de tarea de nodo único
Una tarea de nodo único se ejecuta una vez por ejecución en un ejecutor seleccionado entre todos los ejecutores de la aplicación, según la directiva de enrutamiento.
-
En el panel de navegación izquierdo, seleccione Task Management y haga clic en Add Task. Complete la configuración básica: introduzca un Task Name y un jobHandler name, seleccione la aplicación deseada en Associated Application, elija Round Robin en Routing Policy y haga clic en Next.
Establezca Task Type en BEAN, Blocking Handling Policy en Serial Execution on Single Node y Priority en Medium.
-
Configure Scheduling Settings. Seleccione cron en Time Type y haga clic en Use Generator para generar una cron expression. Este ejemplo se ejecuta una vez al día a las 12:00. Haga clic en Next.
Introduzca
0 0 12 * * ?en el campo cron expression. -
Configure Notifications. Puede establecer alertas de tiempo de espera, notificaciones de éxito, alertas de error, métodos de notificación y destinatarios. Este ejemplo utiliza la configuración predeterminada de la consola.
Después de crearla, haga clic en Run Once en la columna Actions correspondiente a su tarea. En el cuadro de diálogo de ejecución manual, especifique una Target Machine, configure los Instance Parameters y haga clic en OK.
-
Haga clic en para ver los registros de ejecución de la tarea.
La lista de ejecución muestra los registros de tareas, incluidos Execution ID, Task ID/Name, Application, Start Time, End Time, Status y Actions. Para los registros con estado Success, puede consultar Details y Logs. Para los registros con errores, también puede volver a ejecutarlos (Rerun).
-
En el panel de navegación izquierdo, haga clic en Execution List y luego en Log en la columna Actions del registro de ejecución deseado para ver el registro de ejecución de la tarea.
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.
Prueba de tarea de difusión fragmentada
Una tarea de difusión fragmentada se ejecuta en todos los ejecutores de la aplicación durante cada ejecución. Cada ejecutor recibe un número de fragmento único, lo que permite el procesamiento por lotes distribuido. El proyecto de código abierto XXL-JOB carece de agregación para difusiones fragmentadas, pero XXL-JOB de Alibaba Cloud agrega y muestra todos los resultados de fragmentos de cada ejecución.
En el panel de navegación izquierdo, seleccione Task Management y haga clic en Add Task. Complete la configuración básica: introduzca un Task Name y un jobHandler name, seleccione la aplicación deseada en Associated Application, elija Sharded Broadcast en Routing Policy y haga clic en Next.
-
Configure Scheduling Settings. Seleccione cron en Time Type y haga clic en Use Generator para generar una cron expression. Este ejemplo se ejecuta una vez cada hora en el minuto 10. Haga clic en Next.
Introduzca
0 10 * * * ?en el campo cron expression. Configure Notifications. Puede establecer alertas de tiempo de espera, notificaciones de éxito, alertas de error, métodos de notificación y destinatarios. Este ejemplo utiliza la configuración predeterminada de la consola.
Después de crearla, haga clic en Run Once en la columna Actions correspondiente a su tarea. En el cuadro de diálogo de ejecución manual, especifique una Target Machine, configure los Instance Parameters y haga clic en OK.
Haga clic en para ver los registros de ejecución de la tarea.
-
En el panel de navegación izquierdo, haga clic en Execution List. En la página de la lista de ejecución de tareas, haga clic en Details en la columna Actions del registro de ejecución deseado. La sección Shard Details agrega el estado de ejecución de cada máquina.
El resultado de la ejecución muestra un progreso global del 100 %, con ambos fragmentos (fragmento 0 y fragmento 1) completados correctamente.
-
Para cada fragmento, haga clic en Log en la columna Actions para ver el registro de ejecución.
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.