1. 簡介
SpringCloud任務允許用戶使用SpringCloud開發和運行短期的微服務,在本地 、雲環境中、甚至在SpringCloud Data Flow上運行它們。僅添加註解@EnableTask便可將app作爲spring boot app運行。
spring cloud task讓創建短期的微服務變得很容易。它提供的功能允許在生產環境中按需執行短期的JVM進程。
2. 環境要求
Java8級更高版本
spring cloud task使用RDB來存儲任務運行的結果,當然開發的時候也可以不適用數據庫,任務的狀態作爲taskrepository更新的一部分進行記錄。目前支持的RDB有:
- DB2
- H2
- HSQLDB
- MySql
- Oracle
- Postgres
- SqlServer
3. Spring Cloud Task之Hello World
Hello World
引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-task</artifactId>
</dependency>
啓動類
@SpringBootApplication(scanBasePackages = {"com.yuyan"})
@ComponentScan({"com.yuyan"})
@EnableTask
public class StarterApplication {
private static final Logger log = LoggerFactory.getLogger(StarterApplication.class);
public static void main(String[] args) {
SpringApplication.run(StarterApplication.class, args);
}
@Bean
public CommandLineRunner commandLineRunner() {
return new HelloWorldCommandLineRunner();
}
public static class HelloWorldCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... strings) throws Exception {
log.info("running a task!!!!");
}
}
}
application.properties
spring.application.name=task1
logging.level.org.springframework.cloud.task=DEBUG
CommandLineRunner
@EnableTask
這個類級註解用來開啓Spring Cloud Task的功能。默認情況下,會引入一個附加的配置類SimpleTaskConfiguration,這個附加的配置會註冊taskrepository和基礎資源以供使用。
TaskRepository使用內存的Map來保存Task執行的結果。這個Map在生產環境中並不是有效的解決方案,因爲這個Map會隨着任務的結束而銷燬。
CommandLineRunner
SimpleTaskRepository
默認任務倉庫
4. 生命週期
實現接口TaskExecutionListener監聽任務的狀態
@Component
public class MyTaskListener implements TaskExecutionListener {
private static final Logger log = LoggerFactory.getLogger(MyTaskListener.class);
@Override
public void onTaskStartup(TaskExecution taskExecution) {
log.info("starting task:" + taskExecution.getTaskName());
}
@Override
public void onTaskEnd(TaskExecution taskExecution) {
log.info("ending task:" + taskExecution.getTaskName());
}
@Override
public void onTaskFailed(TaskExecution taskExecution, Throwable throwable) {
log.info("task failed:" + taskExecution.getTaskName());
log.error("error msg:", throwable);
}
}
5. 爲任務配置數據源
引入jpa的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
修改application.properties
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/test?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=postgres
spring.datasource.password=root
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults = false
spring.jackson.serialization.indent-output=false
爲TaskConfigurer配置數據源
@Autowired
private DataSource dataSource;
@Bean
public DefaultTaskConfigurer getTaskConfigurer() {
return new DefaultTaskConfigurer(dataSource);
}
運行task之後數據庫中增加如下四張表
task_execution記錄了剛剛任務執行的起始時間、結果等數據
6. 集成Spring Batch
引入spring 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>
application.properties中增加
spring.batch.initialize-schema=always
JobConfiguration
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public Job job1() {
return this.jobBuilderFactory.get("job1")
.start(this.stepBuilderFactory.get("job1step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
logger.info("Job1 was run");
return RepeatStatus.FINISHED;
}
})
.build())
.build();
}
Spring Batch的東西遠不止這些。。。
7. 任務實例個數的限制
引入依賴
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-jdbc</artifactId>
</dependency>
spring.cloud.task.single-instance-enabled爲true表示同一個時刻只能有一個叫這個名字的task執行,否則會拋出Task with name “application” is already running.
#限制同一個時刻只能有一個同名任務執行
spring.cloud.task.single-instance-enabled=true