Spring Cloud任務簡介

1.概述

Spring Cloud Task的目標是提供為Spring Boot應用程序創建短期微服務的功能

在Spring Cloud Task中,我們具有動態運行任何任務,按需分配資源以及在Task完成後檢索結果的靈活性。

Tasks是Spring Cloud Data Flow中的一個新原語,使用戶幾乎可以將所有Spring Boot應用程序作為短期任務執行

2.開發一個簡單的任務應用程序

2.1。添加相關依賴

首先,我們可以添加帶有spring-cloud-task-dependencies:依賴管理部分spring-cloud-task-dependencies:

<dependencyManagement>

 <dependencies>

 <dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-task-dependencies</artifactId>

 <version>2.2.3.RELEASE</version>

 <type>pom</type>

 <scope>import</scope>

 </dependency>

 </dependencies>

 </dependencyManagement>

此依賴關係管理通過導入範圍管理依賴關係的版本。

我們需要添加以下依賴項:

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-starter-task</artifactId>

 </dependency>

 <dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-task-core</artifactId>

 </dependency>

是到spring-cloud-task-core的Maven Central的鏈接。

現在,要啟動我們的Spring Boot應用程序,我們需要帶有相關父級的spring-boot-starter

我們將使用Spring Data JPA作為ORM工具,因此我們還需要為此添加依賴項:

<dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-data-jpa</artifactId>

 <version>2.2.6.RELEASE</version>

 </dependency>

此處提供了使用Spring Data JPA引導簡單的Spring Boot應用程序的詳細信息。

我們可以檢查最新版本的spring-boot-starter-parent Ø n Maven的中央

2.2。 @EnableTask批註

要引導Spring Cloud Task的功能,我們需要添加@EnableTask批註:

@SpringBootApplication

 @EnableTask

 public class TaskDemo {

 // ...

 }

註釋在圖片中TaskRepositorySimpleTaskConfiguration類, TaskRepository又註冊了TaskRepository及其基礎結構。默認情況下,內存映射用於存儲TaskRepository的狀態。

TaskRepository的主要信息在TaskExecution類中建模。此類的註釋字段是taskNamestartTimeendTimeexitMessageexitMessage在退出時存儲可用信息。

如果退出是由應用程序中任何事件的失敗引起的,則完整的異常堆棧跟踪將存儲在此處。

Spring Boot提供了一個ExitCodeExceptionMapper接口,該接口將未捕獲的異常映射到退出代碼,從而可以進行詳細調試。 Cloud Task將信息存儲在數據源中以供將來分析。

2.3。為TaskRepository配置DataSource

一旦任務結束,用於存儲TaskRepository的內存映射將消失,並且我們將丟失與Task事件相關的數據。為了存儲在永久存儲中,我們將使用MySQL作為Spring Data JPA的數據源。

數據源在application.yml文件中配置。為了配置Spring Cloud Task以使用提供的數據源作為TaskRepository的存儲,我們需要創建一個擴展DefaultTaskConfigurer的類。

現在,我們可以將已配置的Datasource作為構造函數參數發送給超類的構造函數:

@Autowired

 private DataSource dataSource;



 public class HelloWorldTaskConfigurer extends DefaultTaskConfigurer{

 public HelloWorldTaskConfigurer(DataSource dataSource){

 super(dataSource);

 }

 }

為了使上述配置生效,我們需要使用@Autowired註釋對DataSource的實例進行註釋,並將該實例作為上面定義的HelloWorldTaskConfigurer bean的構造函數參數注入:

@Bean

 public HelloWorldTaskConfigurer getTaskConfigurer() {

 return new HelloWorldTaskConfigurer(dataSource);

 }

這樣就完成了將TaskRepository存儲到MySQL數據庫的配置。

2.4。實現

在Spring Boot中,我們可以在應用程序完成啟動之前執行任何Task。我們可以使用ApplicationRunnerCommandLineRunner接口創建一個簡單的Task。

我們需要實現這些接口的run方法,並將實現類聲明為Bean:

@Component

 public static class HelloWorldApplicationRunner

 implements ApplicationRunner {



 @Override

 public void run(ApplicationArguments arg0) throws Exception {

 System.out.println("Hello World from Spring Cloud Task!");

 }

 }

現在,如果我們運行應用程序,我們應該讓我們的任務產生必要的輸出,並在MySQL數據庫中創建所需表,並記錄該任務的事件數據。

3. Spring Cloud Task的生命週期

首先,我們在TaskRepository創建一個條目。這表明所有bean都已準備好在應用程序中使用,並且Runner接口的run方法已準備好執行。

run方法執行完成或出現ApplicationContext事件失敗後,將使用另一個條目更新TaskRepository

在任務生命週期中,我們可以註冊TaskExecutionListener接口可用的偵聽器。我們需要一個實現具有三個方法的接口的類-在Task的相應事件中觸發onTaskEndonTaksFailedonTaskStartup

我們需要在TaskDemo類中聲明實現類的bean:

@Bean

 public TaskListener taskListener() {

 return new TaskListener();

 }

4.與Spring Batch集成

我們可以將Spring Batch Job作為Task執行,並使用Spring Cloud Task記錄Job執行的事件。要啟用此功能,我們需要添加與Boot和Cloud有關的Batch依賴項:

<dependency>

 <groupId>org.springframework.boot</groupId>

 <artifactId>spring-boot-starter-batch</artifactId>

 </dependency>

 <dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-task-batch</artifactId>

 </dependency>

spring-cloud-task-batch的Maven Central的鏈接。

要將作業配置為任務,我們需要在JobConfiguration類中註冊Job Bean:

@Bean

 public Job job2() {

 return jobBuilderFactory.get("job2")

 .start(stepBuilderFactory.get("job2step1")

 .tasklet(new Tasklet(){

 @Override

 public RepeatStatus execute(

 StepContribution contribution,

 ChunkContext chunkContext) throws Exception {

 System.out.println("This job is from Baeldung");

 return RepeatStatus.FINISHED;

 }

 }).build()).build();

 }

我們需要使用@EnableBatchProcessing註釋來裝飾TaskDemo

//..Other Annotation..

 @EnableBatchProcessing

 public class TaskDemo {

 // ...

 }

@EnableBatchProcessing批註通過設置批處理作業所需的基本配置來啟用Spring Batch功能。

現在,如果我們運行該應用程序, @EnableBatchProcessing批註將觸發Spring Batch Job的執行,而Spring Cloud Task將記錄所有批處理作業的執行事件以及在springcloud數據庫中執行的其他Task。

5.從流啟動任務

我們可以從Spring Cloud Stream觸發任務。為此,我們提供了@EnableTaskLaucnher批註。一次,我們使用Spring Boot應用程序添加註釋,一個TaskSink將可用:

@SpringBootApplication

 @EnableTaskLauncher

 public class StreamTaskSinkApplication {

 public static void main(String[] args) {

 SpringApplication.run(TaskSinkApplication.class, args);

 }

 }

TaskSink從包含GenericMessage的流中接收消息,該GenericMessage包含TaskLaunchRequest作為有效負載。然後,它將觸發任務啟動請求中提供的基於任務的坐標。

為了具有TaskSink功能,我們需要配置一個實現TaskLauncher接口的bean 。出於測試目的,我們在此處模擬實現:

@Bean

 public TaskLauncher taskLauncher() {

 return mock(TaskLauncher.class);

 }

我們需要在這裡註意,僅在添加spring-cloud-deployer-local依賴項後, TaskLauncher接口才可用:

<dependency>

 <groupId>org.springframework.cloud</groupId>

 <artifactId>spring-cloud-deployer-local</artifactId>

 <version>2.3.1.RELEASE</version>

 </dependency>

我們可以通過調用Sink接口的input來測試Task是否啟動:

public class StreamTaskSinkApplicationTests {



 @Autowired

 private Sink sink;



 //

 }

現在,我們創建TaskLaunchRequest的實例,並將其作為GenericMessage< TaskLaunchRequest >對象的負載發送。然後,我們可以調用Sinkinput通道,將GenericMessage對象保留在通道中。

六,結論

在本教程中,我們探討了Spring Cloud Task的執行方式以及如何對其進行配置以將其事件記錄在數據庫中。我們還觀察瞭如何定義Spring Batch作業並將其存儲在TaskRepository 。最後,我們解釋瞭如何從Spring Cloud Stream中觸發Task。

與往常一樣,代碼可以在GitHub上獲得