简介
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
依赖管理
org.springframework.boot spring-boot-starter-data-jpaorg.springframework.cloud spring-cloud-starter-taskmysql mysql-connector-java
配置文件
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
简单任务
@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); } }
注意这里需要@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()) ; } }
以上是通过注解的方式实现,我们也可以通过实现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) { } }
任务监听发生异常
如果TaskExecutionListener事件处理程序引发异常,则该事件处理程序的所有侦听器处理都将停止。例如,如果已启动三个onTaskStartup侦听器,并且第一个onTaskStartup事件处理程序引发异常,则不会调用其他两个onTaskStartup方法。但是,会调用TaskExecutionListeners的其他事件处理程序(onTaskEnd和onTaskFailed)。因为执行这些回调方法都是在不同的阶段执行的,所以只会影响那个阶段的事件并不会影响其它阶段事件。
限制任务执行
如果你要控制每个任务只允许同时允许一个,那么我们可以通过如下方式控制:
添加依赖:
org.springframework.integration spring-integration-coreorg.springframework.integration spring-integration-jdbc
上面2个依赖是必须的,这是限制任务执行所需要的。
添加配置:
spring: cloud: task: singleInstanceEnabled: true
开启单任务执行。
完毕!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)