什么是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的依赖关系管理部分:

org.springframework.cloud spring-cloud-task-dependencies 1.2.2.RELEASE pom import

此依赖关系管理通过import范围管理具有依赖关系的版本。

我们需要添加以下依赖项:

org.springframework.cloud spring-cloud-starter-task org.springframework.cloud spring-cloud-task-core

现在,要启动我们的Spring Boot应用程序,我们需要与相关父级一起使用spring-boot-starter。

我们将使用Spring Data JPA作为ORM工具,因此我们还需要为其添加依赖项:

org.springframework.boot spring-boot-starter-data-jpa

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:

@Component public static class HelloWorldApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments arg0) throws Exception { // TODO Auto-generated method stub LOGGER.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()); @Override public void onTaskEnd(TaskExecution arg0) { // TODO Auto-generated method stub LOGGER.info(“End of Task”); } @Override public void onTaskFailed(TaskExecution arg0, Throwable arg1) { // TODO Auto-generated method stub } @Override public void onTaskStartup(TaskExecution arg0) { // TODO Auto-generated method stub LOGGER.info(“Task Startup”); }}

我们需要在TaskDemo类中声明实现类的bean :

@Beanpublic TaskListener taskListener() { return new TaskListener();}

运行TaskDemo类,在控制台可看到任务被执行:

14:23:29.974 [main] INFO o.s.j.e.a.AnnotationMBeanExporter – Registering beans for JMX exposure on startup14:23:29.978 [main] INFO o.s.c.s.DefaultLifecycleProcessor – Starting beans in phase 014:23:30.103 [main] INFO c.p.spring.cloud.task.TaskListener – Task Startup14:23:30.109 [main] INFO c.p.spring.cloud.task.TaskDemo – Hello World from Spring Cloud Task!14:23:30.113 [main] INFO c.p.spring.cloud.task.TaskListener – End of Task14:23:30.126 [main] INFO o.s.c.a.AnnotationConfigApplicationContext – Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2a798d51: startup date [Fri Oct 12 14:23:28 CST 2018]; root of context hierarchy14:23:30.127 [main] INFO o.s.c.s.DefaultLifecycleProcessor – Stopping beans in phase 014:23:30.128 [main] INFO o.s.j.e.a.AnnotationMBeanExporter – Unregistering JMX-exposed beans on shutdown14:23:30.128 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean – Closing JPA EntityManagerFactory for persistence unit ‘default’14:23:30.129 [main] INFO o.h.tool.hbm2ddl.SchemaExport – HHH000227: Running hbm2ddl schema export14:23:30.129 [main] INFO o.h.tool.hbm2ddl.SchemaExport – HHH000230: Schema export complete14:23:30.132 [main] INFO c.p.spring.cloud.task.TaskDemo – Started TaskDemo in 2.405 seconds (JVM running for 2.771)

4. 与Spring Batch集成

我们可以将Spring Batch Job作为Task执行,并使用Spring Cloud Task记录Job执行的事件。要启用此功能,我们需要添加与Boot和Cloud相关的Batch依赖项:

org.springframework.boot spring-boot-starter-batch org.springframework.cloud spring-cloud-task-batch

要将作业配置为任务,我们需要在JobConfiguration类中注册Job Bean :

@Bean public Job job2() { return jobBuilderFactory.get(“job2”).start(stepBuilderFactory.get(“job2step1”).tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { LOGGER.info(“This job is from PeterWanghao”); return RepeatStatus.FINISHED; } }).build()).build(); }

我们需要使用@EnableBatchProcessing注解来装饰TaskDemo类:

@SpringBootApplication@EnableTask@EnableBatchProcessingpublic class TaskDemo { // …}

该@EnableBatchProcessing注解集成了Spring Batch的功能,并设置批处理作业所需的基本配置。

现在,如果我们运行应用程序,@ EnableBatchProcessing注释将触发Spring Batch Job执行,Spring Cloud Task将使用springcloud数据库记录所有批处理作业的执行事件。

运行TaskDemo类,在控制台可看到任务被执行:

14:30:26.003 [main] INFO o.s.j.e.a.AnnotationMBeanExporter – Registering beans for JMX exposure on startup14:30:26.008 [main] INFO o.s.c.s.DefaultLifecycleProcessor – Starting beans in phase 014:30:26.047 [main] INFO c.p.spring.cloud.task.TaskListener – Task Startup14:30:26.053 [main] INFO c.p.spring.cloud.task.TaskDemo – Hello World from Spring Cloud Task!14:30:26.054 [main] INFO o.s.b.a.b.JobLauncherCommandLineRunner – Running default command line with: []14:30:26.257 [main] INFO o.s.b.c.l.support.SimpleJobLauncher – Job: [SimpleJob: [name=job1]] launched with the following parameters: [{}]14:30:26.266 [main] INFO o.s.c.t.b.l.TaskBatchExecutionListener – The job execution id 1 was run within the task execution 414:30:26.292 [main] INFO o.s.batch.core.job.SimpleStepHandler – Executing step: [job1step1]14:30:26.312 [main] INFO c.p.s.cloud.task.JobConfiguration – Tasklet has run14:30:26.342 [main] INFO o.s.batch.core.job.SimpleStepHandler – Executing step: [job1step2]14:30:26.353 [main] INFO c.p.s.cloud.task.JobConfiguration – Processing of chunks14:30:26.353 [main] INFO c.p.s.cloud.task.JobConfiguration – Processing of chunks14:30:26.353 [main] INFO c.p.s.cloud.task.JobConfiguration – Processing of chunks14:30:26.354 [main] INFO c.p.s.cloud.task.JobConfiguration – >> -714:30:26.354 [main] INFO c.p.s.cloud.task.JobConfiguration – >> -214:30:26.354 [main] INFO c.p.s.cloud.task.JobConfiguration – >> -314:30:26.359 [main] INFO c.p.s.cloud.task.JobConfiguration – Processing of chunks14:30:26.359 [main] INFO c.p.s.cloud.task.JobConfiguration – Processing of chunks14:30:26.359 [main] INFO c.p.s.cloud.task.JobConfiguration – Processing of chunks14:30:26.359 [main] INFO c.p.s.cloud.task.JobConfiguration – >> -1014:30:26.359 [main] INFO c.p.s.cloud.task.JobConfiguration – >> -514:30:26.359 [main] INFO c.p.s.cloud.task.JobConfiguration – >> -614:30:26.381 [main] INFO o.s.b.c.l.support.SimpleJobLauncher – Job: [SimpleJob: [name=job1]] completed with the following parameters: [{}] and the following status: [COMPLETED]14:30:26.398 [main] INFO o.s.b.c.l.support.SimpleJobLauncher – Job: [SimpleJob: [name=job2]] launched with the following parameters: [{}]14:30:26.404 [main] INFO o.s.c.t.b.l.TaskBatchExecutionListener – The job execution id 2 was run within the task execution 414:30:26.420 [main] INFO o.s.batch.core.job.SimpleStepHandler – Executing step: [job2step1]14:30:26.428 [main] INFO c.p.s.cloud.task.JobConfiguration – This job is from PeterWanghao14:30:26.441 [main] INFO o.s.b.c.l.support.SimpleJobLauncher – Job: [SimpleJob: [name=job2]] completed with the following parameters: [{}] and the following status: [COMPLETED]14:30:26.442 [main] INFO c.p.spring.cloud.task.TaskListener – End of Task14:30:26.448 [main] INFO o.s.c.a.AnnotationConfigApplicationContext – Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@399f45b1: startup date [Fri Oct 12 14:30:23 CST 2018]; root of context hierarchy14:30:26.450 [main] INFO o.s.c.s.DefaultLifecycleProcessor – Stopping beans in phase 014:30:26.450 [main] INFO o.s.j.e.a.AnnotationMBeanExporter – Unregistering JMX-exposed beans on shutdown14:30:26.451 [main] INFO o.s.o.j.LocalContainerEntityManagerFactoryBean – Closing JPA EntityManagerFactory for persistence unit ‘default’14:30:26.451 [main] INFO o.h.tool.hbm2ddl.SchemaExport – HHH000227: Running hbm2ddl schema export14:30:26.451 [main] INFO o.h.tool.hbm2ddl.SchemaExport – HHH000230: Schema export complete14:30:26.455 [main] INFO c.p.spring.cloud.task.TaskDemo – Started TaskDemo in 3.746 seconds (JVM running for 4.093)

5. 从Stream启动任务

我们可以从Spring Cloud Stream触发任务。为了达到这个目的,我们使用@EnableTaskLaucnher注解。这一次,我们使用Spring Boot应用程序添加注释,TaskSink将可用:

@SpringBootApplication@EnableTaskLauncherpublic class StreamTaskSinkApplication { public static void main(String[] args) { SpringApplication.run(TaskSinkApplication.class, args); }}

TaskSink从一个流中接收消息,信息中包含GenericMessage含有TaskLaunchRequest作为有效负载。然后它触发任务启动请求中提供的基于任务的坐标。

要使TaskSink起作用,我们需要配置一个实现TaskLauncher接口的bean。出于测试目的,我们在这里Mock实现:

@Beanpublic TaskLauncher taskLauncher() { return mock(TaskLauncher.class);}

我们需要注意的是,TaskLauncher接口仅在添加spring-cloud-deployer-local依赖项后才可用:

org.springframework.cloud spring-cloud-deployer-local 1.3.1.RELEASE

我们可以测试通过调用发起的任务是否输入了Sink:

public class SpringCloudTaskSinkApplicationIntegrationTest{ @Autowired private Sink sink; //}

现在,我们创建一个TaskLaunchRequest实例,并将其作为GenericMessage 对象的有效负载发送。然后我们可以调用Sink的输入通道,将GenericMessage对象保留在通道中。

六,结论

在本文中,我们探讨了Spring Cloud Task的执行方式以及如何配置它以在数据库中记录其事件。我们还观察了如何定义Spring Batch作业并将其存储在TaskRepository中。最后,我们解释了如何从Spring Cloud Stream中触发Task。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月21日
下一篇 2022年6月21日

相关推荐

  • Kubectl scale 命令最佳实践

    云和安全管理服务专家新钛云服 祝祥翻译 kubectl scale 是帮助我们管理 Kubernetes 部署的众多工具之一。在本文中我们将了解如何使用此工具以及最佳使用实践。 概…

    2022年7月13日
  • 中国排协通报男排冲突事件 调查结束后做出严肃处理

    中新网北京7月11日电 11日下午,中国排协官网发布《关于天津男排和江苏男排冲突事件有关情况的通报》。通报中介绍,7月10日,在2021-2022男排备赛集训教学比赛后,天津男排、…

    2022年7月18日
  • 黄宥嘉转发林志颖车祸新闻,直言:好心救人方法不当,恐反成被告

    林志颖车祸事件确实是闹的沸沸扬扬,如果车祸现场没有那群热心群众,想必林志颖和其儿子KIMI这时连躺在医院的机会都没有了。毕竟就车祸现场目击者爆料,在热心群众救出林志颖后不过五秒,车…

    2022年7月25日
  • 永劫无间大地图事件来了?素质广场上空金乌掠过,剧情正走向高潮

    关注《永劫无间》的玩家们都知道,在即将到来的8月19日,《永劫无间》将迎来一周年的庆典活动,同时也开启了一系列的改动和更新,新地图“火罗国”、新PVE模式“征神之路”、新英雄殷紫萍…

    2022年8月6日
  • 电视盒子什么品牌好?老司机强推2022电视盒子排行榜

    电视盒子功能丰富,价位亲民,适用于市面上绝大部分的电视机,多数家庭都选择购买电视盒子搭配电视机使用。可问题也随之而来,那么多品牌产品,到底电视盒子什么品牌好呢?段臻从事数码行业已有…

    2022年7月23日
  • 「早安语录」生活如果不宠你,那就学会自己善待自己吧

    早安语录Jun/28 (1) 年轻人就该多努力挣钱心情不好就拿钱撒气新的一天,努力吧 (2) 生活如果不宠你那就学会自己善待自己吧这一生,必有风雨兼程闯过去就能遇见最好的自己——早…

    2022年7月1日
  • linux系统下怎么修改path环境变量?

    linux修改PATH环境变量四种方式: Linux修改PATH环境变量的四种方式,每种方式有不同的权限。以添加mongodb server变量为列: 1.修改临时型的PATH 查…

    2022年6月25日
  • 有哪些简单方便的祛斑方法?

      怎样让脸上的斑点淡化?产后脸上长斑怎样消除斑点?每个人都喜好干净白皙的肌肤,但是对于产后的宝妈们来说,干净的肌肤却不是那么容易拥有的,由于对宝宝的关注导致经常熬夜,对于自己的肌…

    2022年8月12日
  • 快乐的方法-将喜欢的事做到极致

    将喜欢的事情做到极致,就是一种非常好的快乐方法。 做你喜欢的事情时,你不会感觉到累,你感觉得只是快乐,虽然你的身体很累,但是,你的心情很愉悦。 做你喜欢的事情时,要及时总结、记录你…

    2022年6月9日
  • 74岁日本奶奶的穿搭火了!用态度告诉你:老了,简单是最高级时尚

    著名心理学家马斯洛说:“心态改变,态度跟着改变;态度改变,习惯跟着改变;习惯改变,性格跟着改变;性格改变,人生就跟着改变。”女人生活的心态,决定了自己的命运,更成就了自己的未来。心…

    2022年7月25日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息