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. 啟動應用程式

    最後,您可以啟動應用程式

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。