erosynthesis

erosynthesis

使用Spring Cloud Task和Spring Cloud Scheduler实现分布式定时任务

  1. 创建一个 Spring Boot 应用程序并添加依赖项

    首先,创建一个 Spring Boot 应用程序并将以下依赖项添加到 build.gradle 或 pom.xml 文件中:

    dependencies {
        implementation 'org.springframework.cloud:spring-cloud-starter-task'
        implementation 'org.springframework.cloud:spring-cloud-starter-scheduler'
        // 其他依赖项
    }
    
  2. 编写 TaskLauncher 类

    接下来,您需要编写一个 TaskLauncher 类,它负责启动和停止任务。这个类可以使用 Spring Cloud Task 提供的 TaskLauncher 接口来实现,如下所示:

    import org.springframework.cloud.task.launcher.TaskLaunchRequest;
    import org.springframework.cloud.task.launcher.TaskLauncher;
    
    public class MyTaskLauncher {
    
        private final TaskLauncher taskLauncher;
    
        public MyTaskLauncher(TaskLauncher taskLauncher) {
            this.taskLauncher = taskLauncher;
        }
    
        public void launchTask(String taskName, String commandLineArgs) {
            TaskLaunchRequest request = new TaskLaunchRequest(
                    "classpath:/tasks/" + taskName + ".jar",
                    commandLineArgs,
                    null, null, null);
            taskLauncher.launch(request);
        }
    
        public void stopTask(long taskId) {
            taskLauncher.stop(taskId);
        }
    }
    
    

    在这个例子中,MyTaskLauncher 类包含了 launchTask () 方法和 stopTask () 方法。launchTask () 方法将根据传入的任务名称和命令行参数启动一个新的任务,并返回任务 ID。stopTask () 方法将停止指定的任务。

  3. 编写 TaskScheduler 类

    接下来,您需要编写一个 TaskScheduler 类,它将负责安排任务并将其发送到 TaskLauncher 进行执行。您可以使用 Spring Cloud Scheduler 提供的 ScheduledTaskRegistrar 和 ScheduledTask 类来实现这个类,如下所示:

    import org.springframework.cloud.scheduler.ScheduledTask;
    import org.springframework.cloud.scheduler.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    
    public class MyTaskScheduler {
    
        private final ScheduledTaskRegistrar taskRegistrar;
        private final MyTaskLauncher taskLauncher;
    
        public MyTaskScheduler(ScheduledTaskRegistrar taskRegistrar, MyTaskLauncher taskLauncher) {
            this.taskRegistrar = taskRegistrar;
            this.taskLauncher = taskLauncher;
        }
    
        public void scheduleTask(String taskName, String cronExpression, String commandLineArgs) {
            ScheduledTask task = taskRegistrar.scheduleCronTask(() -> {
                taskLauncher.launchTask(taskName, commandLineArgs);
            }, new CronTrigger(cronExpression));
            task.getTaskId(); // 可选:保存任务ID以便稍后停止任务
        }
    
        public void unscheduleTask(long taskId) {
            taskRegistrar.removeScheduledTask(taskId);
            taskLauncher.stopTask(taskId);
        }
    }
    
    

    在这个例子中,MyTaskScheduler 类包括了 scheduleTask () 方法和 unscheduleTask () 方法。scheduleTask () 方法将安排一个新的任务,该任务将在指定的 cron 表达式触发时执行。unscheduleTask () 方法将取消该任务的调度并停止该任务的运行(如果正在运行)。

  4. 定义和注册任务

    现在,您可以定义和注册要执行的任务。这些任务可以是普通的 Java 类,也可以是 Spring Batch 作业或其他类型的任务。在此示例中,我们将创建一个简单的 Java 类来表示一个任务:

    public class MyTask implements Runnable {
    
        private final String name;
    
        public MyTask(String name) {
            this.name = name;
        }
    
        @Override
        public void run() {
            System.out.println("Running task " + name);
        }
    }
    
    

    然后,您可以通过创建 MyTask 实例并将其传递给 MyTaskScheduler 的 scheduleTask () 方法来注册任务,如下所示:

    @Autowired
    private MyTaskScheduler taskScheduler;
    
    @PostConstruct
    public void init() {
        taskScheduler.scheduleTask("my-task", "0 0/5 * * * ?", "arg1 arg2");
    }
    
    

    在这个例子中,我们使用了 @PostConstruct 注解来确保任务在应用程序启动时自动注册和调度。

  5. 启动应用程序

    最后,您可以启动应用程序

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。