深圳幻海软件技术有限公司 欢迎您!

Spring Cloud Task 一个允许短期运行的微服务组件

2023-02-28

简介SpringCloudTask允许用户使用SpringCloud开发和运行短期的微服务,并在本地、云中甚至在SpringCloud数据流上运行它们。只需添加@EnableTask并将应用程序作为SpringBoot应用程序运行(单个应用程序上下文)。SpringCloudTask使创建短期微服务

简介

Spring Cloud Task允许用户使用Spring Cloud开发和运行短期的微服务,并在本地、云中甚至在Spring Cloud数据流上运行它们。只需添加@EnableTask并将应用程序作为Spring Boot应用程序运行(单个应用程序上下文)。

Spring Cloud Task使创建短期微服务变得容易。它提供了在生产环境中按需执行短期JVM进程的功能。

环境要求

你需要安装Java(Java 8或更高的版本)。要进行构建,还需要安装Maven。

数据库要求

Spring Cloud Task使用关系数据库存储已执行任务的结果。虽然你可以在没有数据库的情况下开始开发任务(任务的状态记录为任务存储库更新的一部分),但对于生产环境,你希望使用受支持的数据库。Spring Cloud Task 目前支持以下数据库:

  • DB2
  • H2
  • HSQLDB
  • MySql
  • Oracle
  • Postgres
  • SqlServer

依赖管理

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-task</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

配置文件

server:
  port: 8082
---
spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tasks?serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
    username: root
    password: root
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimumIdle: 10
      maximumPoolSize: 200
      autoCommit: true
      idleTimeout: 30000
      poolName: MasterDatabookHikariCP
      maxLifetime: 1800000
      connectionTimeout: 30000
      connectionTestQuery: SELECT 1
---
spring:
  h2:
    console:
      enabled: true
      settings:
        web-allow-others: true
      path: /h2
---
spring:
  application:
    name: taskDemo      
---
logging:
  level:
    org.springframework.cloud.task: DEBUG
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

简单任务

@SpringBootApplication
@EnableTask
public class SpringCloudTaskDemoApplication {

  @Bean
  public CommandLineRunner helloRunner() {
    return new CommandLineRunner() {
      @Override
      public void run(String... args) throws Exception {
        System.out.println("开始执行任务") ;
        TimeUnit.SECONDS.sleep(1) ;
        System.out.println("任务执行完成") ;
      }
    };
  }
  
  public static void main(String[] args) {
    SpringApplication.run(SpringCloudTaskDemoApplication.class, args);
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

注意这里需要@EnableTask开启功能,然后自定义了一个CommandLineRunner类型的Bean。我们的任务都应该在CommandLineRunner或者ApplicationRunner中执行。

执行

run方法执行完以后我们的JVM进程也跟着结束了。这就是所谓的短期任务了,我们不需要任务一直执行,只需要在需要的时候执行即可。

任务执行完以后会在数据表中记录相关的执行结果信息。

这些表记录了本次任务执行的相关信息,成功,失败等。

事件监听

我们任务的执行在每一个节点上都可以进行相关的监听处理

@Component
public class TaskListenerConfig {
  
  @BeforeTask
  public void before(TaskExecution taskExecution) {
    System.out.println("任务执行前") ;
  }

  @AfterTask
  public void after(TaskExecution taskExecution) {
    System.out.println("任务执行后") ;
  }

  @FailedTask
  public void fail(TaskExecution taskExecution, Throwable throwable) {
    System.out.println("任务执行失败," + throwable.getMessage()) ;
  }
  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

以上是通过注解的方式实现,我们也可以通过实现TaskExecutionListener接口的方式实现。

@Component
public class DemoListener implements TaskExecutionListener {

  @Override
  public void onTaskStartup(TaskExecution taskExecution) {
  }

  @Override
  public void onTaskEnd(TaskExecution taskExecution) {
  }

  @Override
  public void onTaskFailed(TaskExecution taskExecution, Throwable throwable) {
  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

任务监听发生异常

如果TaskExecutionListener事件处理程序引发异常,则该事件处理程序的所有侦听器处理都将停止。例如,如果已启动三个onTaskStartup侦听器,并且第一个onTaskStartup事件处理程序引发异常,则不会调用其他两个onTaskStartup方法。但是,会调用TaskExecutionListeners的其他事件处理程序(onTaskEnd和onTaskFailed)。因为执行这些回调方法都是在不同的阶段执行的,所以只会影响那个阶段的事件并不会影响其它阶段事件。

限制任务执行

如果你要控制每个任务只允许同时允许一个,那么我们可以通过如下方式控制:

添加依赖:

<dependency>
  <groupId>org.springframework.integration</groupId>
  <artifactId>spring-integration-core</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.integration</groupId>
  <artifactId>spring-integration-jdbc</artifactId>
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

上面2个依赖是必须的,这是限制任务执行所需要的。

添加配置:

spring:
  cloud:
    task:
      singleInstanceEnabled: true
  • 1.
  • 2.
  • 3.
  • 4.

开启单任务执行。

完毕!!