什么是Spring Cloud Task啊?简单示例下

1. 概述Spring Cloud Task的目标是为Spring Boot应用程序提供创建短运行期微服务的功能 。在Spring Cloud Task中,我们可以灵活地动态运行任何任务,按需分配资源并在任务完成后检索结果 。Tasks是Spring Cloud Data Flow中的一个基础项目,允许用户将几乎任何Spring Boot应用程序作为一个短期任务执行 。
2. 一个简单的任务应用程序2.1 添加相关依赖项首先,我们可以添加具有
spring-cloud-task-dependencies的依赖关系管理部分:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-task-dependencies</artifactId><version>1.2.2.RELEASE</version><type>pom</type><scope>import</scope></dependency>此依赖关系管理通过import范围管理具有依赖关系的版本 。
我们需要添加以下依赖项:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-task</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-task-core</artifactId></dependency>现在,要启动我们的Spring Boot应用程序,我们需要与相关父级一起使用spring-boot-starter 。
我们将使用Spring Data JPA作为ORM工具,因此我们还需要为其添加依赖项:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>2.2 @EnableTask注解要引导Spring Cloud Task的功能,我们需要添加@EnableTask注解:
@SpringBootApplication@EnableTaskpublic class TaskDemo {// ...}该注解在程序中引入了SimpleTaskConfiguration类,该类依次注册TaskRepository及其基础结构 。默认情况下,内存映射用于存储TaskRepository的状态 。
TaskRepository的主要信息在TaskExecution类中建模 。该类的包含的字段有taskName,startTime,endTime,exitMessage 。exitMessage在退出的时候存储一些有用信息 。
如果退出是由应用程序的任何事件中的失败引起的,则完整的异常堆栈跟踪将存储在此处 。
Spring Boot提供了一个接口ExitCodeExceptionMapper,它将未捕获的异常映射到允许经过详细调试的退出代码 。Cloud Task将信息存储在数据源中以供将来分析 。
2.3 为TaskRepository配置DataSource一旦任务结束,存储TaskRepository的内存映射将消失,我们将丢失与Task事件相关的数据 。要想永久存储,我们将使用MySQL作为Spring Data JPA的数据源 。
数据源 在application.yml文件中配置 。要配置Spring Cloud Task以使用提供的数据源作为TaskRepository的存储,我们需要创建一个扩展DefaultTaskConfigurer的类 。
现在,我们可以将配置的Datasource作为构造函数参数发送到超类的构造函数:
public class HelloWorldTaskConfigurer extends DefaultTaskConfigurer{public HelloWorldTaskConfigurer(DataSource dataSource){super(dataSource);}}为了实现上述配置,我们需要使用@Autowired批注注释DataSource的实例,并将实例注入上面定义的HelloWorldTaskConfigurer bean的构造参数中 :
@Autowiredprivate DataSource dataSource;@Beanpublic HelloWorldTaskConfigurer getTaskConfigurer() {return new HelloWorldTaskConfigurer(dataSource);}这样就完成了将TaskRepository存储到MySQL数据库的配置 。
2.4 实现在Spring Boot中,我们可以在应用程序完成启动之前执行任何任务 。我们可以使用ApplicationRunner或CommandLineRunner接口来创建一个简单的Task 。
我们需要实现这些接口的run方法,并将实现类声明为bean:
@Componentpublic static class HelloWorldApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments arg0) throws Exception {// TODO Auto-generated method stubLOGGER.info("Hello World from Spring Cloud Task!");}}3. Spring Cloud Task的生命周期首先,我们在TaskRepository中创建一个条目 。这表明所有bean都已准备好在Application中使用,并且Runner接口的run方法已准备好执行 。
完成run方法的执行或ApplicationContext事件的任何失败后,TaskRepository将使用另一个条目进行更新 。
在任务生命周期中,我们可以在TaskExecutionListener接口中注册侦听器 。我们需要一个实现接口的类,它有三个方法 - 在Task的各个事件中触发onTaskEnd,onTaksFailed和onTaskStartup 。
public class TaskListener implements TaskExecutionListener {private final static Logger LOGGER = Logger.getLogger(TaskListener.class.getName());@Overridepublic void onTaskEnd(TaskExecution arg0) {// TODO Auto-generated method stubLOGGER.info("End of Task");}@Overridepublic void onTaskFailed(TaskExecution arg0, Throwable arg1) {// TODO Auto-generated method stub}@Overridepublic void onTaskStartup(TaskExecution arg0) {// TODO Auto-generated method stubLOGGER.info("Task Startup");}}


推荐阅读