Рубрики
Без рубрики

Введение в задачу Spring Cloud

Узнайте, как работает задача Spring Cloud и как настроить ее для регистрации событий в базе данных.

Автор оригинала: baeldung.

1. Обзор

Цель задачи Spring Cloud – обеспечить функциональность создания недолговечных микросервисов для приложения Spring Boot .

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

Tasks-это новый примитив в потоке данных Spring Cloud, позволяющий пользователям выполнять практически любое приложение Spring Boot в качестве кратковременной задачи .

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

2.1. Добавление Соответствующих Зависимостей

Для начала мы можем добавить раздел управления зависимостями с spring-cloud-task-dependencies:


    
        
            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.4.0

Подробная информация о загрузке простого приложения Spring Boot с Spring Data JPA доступна здесь .

Мы можем проверить новейшую версию spring-boot-starter-parent o |/n |/Maven Central .

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

Чтобы загрузить функциональность задачи Spring Cloud, нам нужно добавить @EnableTask аннотацию:

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

Аннотация выводит Простую конфигурацию задачи класс на рисунке, который, в свою очередь, регистрирует Репозиторий задач и его инфраструктуру . По умолчанию для хранения состояния репозитория Задач используется карта в памяти .

Основная информация Репозитория задач моделируется в классе Выполнение задач . Отмеченными полями этого класса являются Имя задачи , Время начала , время окончания , сообщение о выходе . Сообщение exit сохраняет доступную информацию во время выхода.

Если выход вызван сбоем в любом случае приложения, здесь будет сохранена полная трассировка стека исключений.

Spring Boot предоставляет интерфейс ExitCodeException Mapper , который сопоставляет неперехваченные исключения с кодами выхода, позволяющими тщательно отлаживать . Облачная задача сохраняет информацию в источнике данных для дальнейшего анализа.

2.3. Настройка источника данных для репозитория задач

Карта в памяти для хранения репозитория Задач исчезнет, как только задача завершится, и мы потеряем данные, связанные с событиями задачи. Для хранения в постоянном хранилище мы будем использовать MySQL в качестве источника данных с Spring Data JPA.

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

Теперь мы можем отправить сконфигурированный Источник данных в качестве аргумента конструктора в конструктор суперкласса:

@Autowired
private DataSource dataSource;

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

Чтобы иметь приведенную выше конфигурацию в действии, нам нужно аннотировать экземпляр DataSource с @Autowired аннотацией и ввести экземпляр в качестве аргумента конструктора HelloWorldTaskConfigurer bean, определенного выше:

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

Это завершает настройку для хранения Репозитория задач в базе данных MySQL.

2.4. Реализация

В Spring Boot мы можем выполнить любую задачу непосредственно перед завершением запуска приложения. Мы можем использовать Application Runner или CommandLineRunner интерфейсы для создания простой задачи.

Нам нужно реализовать метод run этих интерфейсов и объявить реализующий класс как компонент:

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

Теперь, если мы запустим наше приложение, мы должны получить нашу задачу, производящую необходимые выходные данные с необходимыми таблицами, созданными в нашей базе данных MySQL, регистрирующими данные о событиях задачи.

3. Жизненный цикл задачи “Весеннее облако”

В начале мы создаем запись в репозитории Задач . Это указывает на то, что все компоненты готовы к использованию в приложении и метод run интерфейса Runner готов к выполнению.

По завершении выполнения метода run или при любом сбое события ApplicationContext Репозиторий Задач будет обновлен другой записью.

В течение жизненного цикла задачи мы можем зарегистрировать прослушиватели, доступные из TaskExecutionListener interface . Нам нужен класс, реализующий интерфейс, имеющий три метода – onTaskEnd , onTaksFailed и onTaskStartup , запускаемые в соответствующих событиях Задачи.

Нам нужно объявить компонент реализующего класса в нашем Task Demo классе:

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

4. Интеграция С Весенней Партией

Мы можем выполнить пакетное задание Spring в качестве задачи и регистрировать события выполнения задания с помощью задачи Spring Cloud. Чтобы включить эту функцию, нам нужно добавить пакетные зависимости, относящиеся к загрузке и облаку:


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


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

Здесь находится ссылка на Maven Central из spring-cloud-task-batch .

Чтобы настроить задание как задачу, нам нужно, чтобы задание было зарегистрировано в классе Конфигурация задания :

@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();
}

Нам нужно украсить Демонстрацию задачи класс @EnableBatchProcessing аннотацией :

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

То @EnableBatchProcessing аннотация позволяет создавать пакетные объекты с базовой конфигурацией, необходимой для настройки пакетных заданий.

Теперь, если мы запустим приложение, аннотация @EnableBatchProcessing запустит выполнение пакетного задания Spring, а задача Spring Cloud будет регистрировать события выполнения всех пакетных заданий вместе с другой задачей, выполняемой в базе данных springcloud .

5. Запуск задачи из потока

Мы можем запускать задачи из потока Spring Cloud. Для этой цели у нас есть @EnableTaskLaucnher аннотация. Как только мы добавим аннотацию с приложением Spring Boot, будет доступен приемник задач:

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

Приемник задач получает сообщение из потока, содержащего Общее сообщение , содержащее Запрос на запуск задачи в качестве полезной нагрузки. Затем он запускает задачу на основе координат, указанных в запросе на запуск задачи.

Чтобы иметь TaskSink функциональный, нам требуется сконфигурированный компонент, реализующий Task Launcher интерфейс . В целях тестирования мы издеваемся над реализацией здесь:

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

Здесь мы должны отметить, что Средство запуска задач интерфейс доступен только после добавления spring-cloud-deployer-локальный зависимость:


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

Мы можем проверить, запущена ли задача, вызвав input интерфейса Sink :

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

Теперь мы создаем экземпляр Запроса на запуск задачи и отправляем его в качестве полезной нагрузки Общего сообщения< Запроса на запуск задачи > объекта. Затем мы можем вызвать вход канал приемника , сохраняя Общее сообщение объект в канале.

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

В этом руководстве мы рассмотрели, как выполняется задача Spring Cloud и как настроить ее для регистрации событий в базе данных. Мы также наблюдали, как определяется и хранится пакетное задание Spring в репозитории Task . Наконец, мы объяснили, как мы можем запускать задачу из потока Spring Cloud.

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