spring cloud之spring cloud task

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章