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 .