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 {
// ...
}
註釋在圖片中TaskRepository
了SimpleTaskConfiguration
類, TaskRepository
又註冊了TaskRepository
及其基礎結構。默認情況下,內存映射用於存儲TaskRepository
的狀態。
TaskRepository
的主要信息在TaskExecution
類中建模。此類的註釋字段是taskName
, startTime
, endTime
, exitMessage
。 exitMessage
在退出時存儲可用信息。
如果退出是由應用程序中任何事件的失敗引起的,則完整的異常堆棧跟踪將存儲在此處。
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。我們可以使用ApplicationRunner
或CommandLineRunner
接口創建一個簡單的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的相應事件中觸發onTaskEnd
, onTaksFailed
和onTaskStartup
。
我們需要在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 >
對象的負載發送。然後,我們可以調用Sink
的input
通道,將GenericMessage
對象保留在通道中。
六,結論
在本教程中,我們探討了Spring Cloud Task的執行方式以及如何對其進行配置以將其事件記錄在數據庫中。我們還觀察瞭如何定義Spring Batch作業並將其存儲在TaskRepository
。最後,我們解釋瞭如何從Spring Cloud Stream中觸發Task。
與往常一樣,代碼可以在GitHub上獲得。