Task
簡介
為了短期或者一次性執(zhí)行某種任務,比如統(tǒng)計,更新數(shù)據(jù)等所使用的短期框架,也可以與flow data 大數(shù)據(jù)分析進行結(jié)合,但本文章只說明Task單獨使用
搭建
1. 使用spring cloud的框架
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>task</artifactId>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
<!-- lookup parent thirdpart repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- 短期任務 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-task</artifactId>
</dependency>
<!-- task依賴龄章,不要去除 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- jpa jar -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
添加注解
在Application中添加注解
@EnableDiscoveryClient
@SpringBootApplication
@EnableConfigurationProperties
@EnableTask
public class Application{
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
添加任務執(zhí)行
使用注解方式,添加任務乞封,任務的執(zhí)行會分為三部分:
- @BeforeTask 任務開始
- @AfterTask 任務結(jié)束
- @FailedTask 任務異常做裙,如果發(fā)生會優(yōu)先結(jié)束執(zhí)行
@Component
public class taskRunner{
@BeforeTask
public void onTaskStartup(TaskExecution taskExecution) {
logger.info("任務執(zhí)行 start");
}
@AfterTask
public void onTaskEnd(TaskExecution taskExecution) {
logger.info("任務執(zhí)行 end");
}
@FailedTask
public void onTaskEndFailed(TaskExecution taskExecution, Throwable throwable) {
logger.info("任務執(zhí)行 failed"");
}
}
這樣就可以正常運行一個簡單的Task了。
配置
一肃晚、配置項說明 TaskConfigurer
TaskConfigurer是一個允許用戶自定義Spring Cloud Task組件配置的策略接口锚贱,其默認實現(xiàn)DefaultTaskConfigurer提供了應用的默認邏輯(當應用上下文中沒有DataSource時使用內(nèi)存Map作為任務倉庫存儲。當上下文中有DataSource時关串,使用依賴于 JDBC 的組件實現(xiàn)任務倉庫惋鸥。)。
這里有個疑問:有數(shù)據(jù)庫的情況下悍缠,必須創(chuàng)建和存儲任務數(shù)據(jù)卦绣,沒辦法不保存數(shù)據(jù)。如下場景飞蚓,更新業(yè)務數(shù)據(jù)庫中數(shù)據(jù)滤港,但是不想在數(shù)據(jù)庫中添加任務的相關(guān)結(jié)構(gòu);或者單獨存儲任務的數(shù)據(jù),在一個任務中執(zhí)行了不同的業(yè)務數(shù)據(jù)的操作溅漾;
TaskConfigurer主要包含三種組件山叮,如表1所示:
組件名 | 描述 | 默認值(由 TaskConfigurer 提供) |
---|---|---|
TaskRepository | TaskRepository接口的實現(xiàn)類,作為任務倉庫使用 | SimpleTaskRepository |
TaskExplorer | TaskExplorer接口的實現(xiàn)類(任務探測器是只讀訪問任務倉庫的組件) | SimpleTaskExplorer |
PlatformTransactionManager | 對任務倉庫執(zhí)行更新操作時所使用的事務管理器 | 如果應用上下文中配置有DataSource添履,默認的事務管理器為DataSourceTransactionManager屁倔。如果應用上下文中沒有數(shù)據(jù)源,則默認的事務管理器是ResourcelessTransactionManager暮胧。 |
表1 TaskConfigurer的三種主要組件
在定制 TaskConfigurer 時推薦直接繼承已有的成熟TaskConfigurer接口锐借,例如繼承 DefaultTaskConfigurer,覆蓋所需要的getter就足夠了往衷。否則的話钞翔,你需要重寫整個 TaskConfigurer 的邏輯。
二席舍、執(zhí)行方式
spring:
cloud:
task:
closecontext-enabled: true # 執(zhí)行完成后布轿,關(guān)閉服務
三、數(shù)據(jù)庫配置
默認情況下来颤,會使用H2 嵌入式內(nèi)存數(shù)據(jù)庫作為數(shù)據(jù)源來啟動發(fā)布task汰扭,如果需要進行存儲任務執(zhí)行的情況,可以對在配置文件中添加相關(guān)的配置福铅,這里我介紹下使用JPA的使用方式:
spring.cloud.task配置開頭东且,例如:spring.cloud.task.tablePrefix
下面對配置項進行說明:
配置項 | 說明 |
---|---|
tablePrefix | 數(shù)據(jù)庫表,命名前綴:默認為TASK_ |
executionid | 任務實例ID本讥,存儲到數(shù)據(jù)庫 |
external-execution-id | 外部任務ID |
parent-execution-id | 父類任務ID,可以在一個任務中調(diào)用另一個任務 |
single-instance-enabled | 啟用單個實例模式 |