Въведение в пролетната облачна задача

1. Общ преглед

Целта на Spring Cloud Task е да предостави функционалността за създаване на краткотрайни микроуслуги за приложението Spring Boot .

В Spring Cloud Task имаме гъвкавост при динамично изпълнение на всяка задача, разпределяне на ресурси при поискване и извличане на резултатите след завършване на задачата.

Tasks е нов примитив в Spring Cloud Data Flow, който позволява на потребителите да изпълняват практически всяко приложение Spring Boot като краткотрайна задача .

2. Разработване на приложение за проста задача

2.1. Добавяне на съответни зависимости

За начало можем да добавим раздел за управление на зависимости с пролет-облак-задачи-зависимости:

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

Това управление на зависимостите управлява версии на зависимости чрез обхвата на импортиране.

Трябва да добавим следните зависимости:

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

Това е връзката към Maven Central на spring-cloud-task-core .

Сега, за да стартираме нашето приложение Spring Boot, се нуждаем от spring-boot-starter със съответния родител.

Ще използваме Spring Data JPA като ORM инструмент, така че трябва да добавим зависимостта и за това:

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

Подробностите за зареждане на просто приложение Spring Boot с Spring Data JPA са достъпни тук.

Ние можем да се покажат най-новата версия на пролетно-обувка стартер родител о н Maven Central.

2.2. В @EnableTask анотацията

За да стартираме функционалността на Spring Cloud Task, трябва да добавим анотация @EnableTask :

@SpringBootApplication @EnableTask public class TaskDemo { // ... } 

Анотацията носи клас SimpleTaskConfiguration в картината, който от своя страна регистрира TaskRepository и неговата инфраструктура . По подразбиране се използва карта в паметта за съхраняване на състоянието на TaskRepository .

Основната информация на TaskRepository е моделирана в клас TaskExecution . Забелязаните полета от този клас са taskName , startTime , endTime , exitMessage . В exitMessage съхранява наличната информация към момента на излизане.

Ако изходът е причинен от повреда във всяко събитие на приложението, пълната проследяване на стека на изключения ще се съхранява тук.

Spring Boot осигурява интерфейс ExitCodeExceptionMapper, който съпоставя незаловените изключения с кодове за изход, позволяващи внимателно отстраняване на грешки . Облачната задача съхранява информацията в източника на данни за бъдещ анализ.

2.3. Конфигуриране на DataSource за TaskRepository

Картата в паметта за съхранение на TaskRepository ще изчезне, след като задачата приключи и ще загубим данни, свързани със събития на Task. За да съхраняваме в постоянно хранилище, ще използваме MySQL като източник на данни с Spring Data JPA.

Източникът на данни е конфигуриран във файла application.yml . За да конфигурираме Spring Cloud Task да използва предоставения източник на данни като хранилище на TaskRepository , трябва да създадем клас, който разширява DefaultTaskConfigurer .

Сега можем да изпратим конфигуриран Datasource като аргумент на конструктор към конструктора на суперкласа:

@Autowired private DataSource dataSource; public class HelloWorldTaskConfigurer extends DefaultTaskConfigurer{ public HelloWorldTaskConfigurer(DataSource dataSource){ super(dataSource); } }

За да имаме в действие горната конфигурация, трябва да анотираме екземпляр на DataSource с @Autowired анотация и да инжектираме екземпляра като конструктор-аргумент на бион HelloWorldTaskConfigurer, дефиниран по-горе:

@Bean public HelloWorldTaskConfigurer getTaskConfigurer() { return new HelloWorldTaskConfigurer(dataSource); }

Това завършва конфигурацията за съхраняване на TaskRepository в базата данни MySQL.

2.4. Изпълнение

In Spring Boot, we can execute any Task just before application finishes its startup. We can use ApplicationRunner or CommandLineRunner interfaces to create a simple Task.

We need to implement the run method of these interfaces and declare the implementing class as a bean:

@Component public static class HelloWorldApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments arg0) throws Exception { System.out.println("Hello World from Spring Cloud Task!"); } }

Now, if we run our application, we should get our task producing necessary output with required tables created in our MySQL database logging the event data of the Task.

3. Life-cycle of a Spring Cloud Task

In the beginning, we create an entry in the TaskRepository. This's the indication that all beans are ready to be used in the Application and the run method of Runner interface is ready to be executed.

Upon completion of the execution of the run method or in any failure of ApplicationContext event, TaskRepository will be updated with another entry.

During the task life-cycle, we can register listeners available from TaskExecutionListener interface. We need a class implementing the interface having three methods – onTaskEnd, onTaksFailed and onTaskStartup triggered in respective events of the Task.

We need to declare the bean of the implementing class in our TaskDemo class:

@Bean public TaskListener taskListener() { return new TaskListener(); }

4. Integration With Spring Batch

We can execute Spring Batch Job as a Task and log events of the Job execution using Spring Cloud Task. To enable this feature we need to add Batch dependencies pertaining to Boot and Cloud:

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

Here is the link to the Maven Central of spring-cloud-task-batch.

To configure a job as a Task we need to have the Job bean registered in the JobConfiguration class:

@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 { System.out.println("This job is from Baeldung"); return RepeatStatus.FINISHED; } }).build()).build(); }

We need to decorate the TaskDemo class with @EnableBatchProcessing annotation:

//..Other Annotation.. @EnableBatchProcessing public class TaskDemo { // ... }

The @EnableBatchProcessing annotation enables Spring Batch features with a base configuration required to set up batch jobs.

Now, if we run the application, the @EnableBatchProcessing annotation will trigger the Spring Batch Job execution and Spring Cloud Task will log the events of the executions of all batch jobs with the other Task executed in the springcloud database.

5. Launching a Task from Stream

We can trigger Tasks from Spring Cloud Stream. To serve this purpose, we have the @EnableTaskLaucnher annotation. Once, we add the annotation with Spring Boot app, a TaskSink will be available:

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

The TaskSink receives the message from a stream that contains a GenericMessage containing TaskLaunchRequest as a payload. Then it triggers a Task-based on co-ordinate provided in the Task launch request.

To have TaskSink functional, we require a bean configured that implements TaskLauncher interface. For testing purpose, we're mocking the implementation here:

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

We need to note here that the TaskLauncher interface is only available after adding the spring-cloud-deployer-local dependency:

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

We can test whether the Task launched by invoking input of the Sink interface:

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

Сега създаваме екземпляр на TaskLaunchRequest и го изпращаме като полезен товар на обект GenericMessage . След това можем да извикаме входния канал на мивката, задържайки обекта GenericMessage в канала.

6. Заключение

В този урок разгледахме как се изпълнява Spring Cloud Task и как да го конфигурираме, за да регистрира своите събития в база данни. Също така наблюдавахме как заданието Spring Batch се дефинира и съхранява в TaskRepository . И накрая, обяснихме как можем да задействаме Task от Spring Cloud Stream.

Както винаги, кодът е достъпен в GitHub.