Автор оригинала: Guest Contributor.
Вступление
В настоящее время микросервисы развиваются повсюду вокруг нас. Многие из этих услуг недолговечны . Запланированные задачи, синхронизация данных, агрегирование данных, создание отчетов и аналогичные услуги являются недолговечными. Обычно ожидается, что они начнутся, завершатся и завершатся.
Для этой цели было создано множество внешних приложений и планировщиков, однако иногда вам требуется пользовательская задача, требующая глубокой интеграции с приложением вашей организации.
Платформа Spring Boot делает эту функциональность доступной для разработчиков через API задач Spring Cloud .
Что такое задача Spring Cloud?
Обычно ожидается, что службы будут работать в течение длительного времени. Средняя служба весенней загрузки включает встроенный веб-сервер, такой как Tomcat, Jetty или Undertow. Служба завершается, потому что она специально остановлена или произошла ошибка во время выполнения, такая как OOM ( OutOfMemoryError
).
Spring Boot был построен таким образом, но по мере того, как парадигмы менялись и архитектура микросервисов становилась популярной, многие сервисы стали недолговечными. Это было излишним, так как служба кратковременных уведомлений не нуждается во встроенном сервере и может быть намного более легкой.
Задача Spring Cloud – это ответ Spring на проблему недолговечных микросервисов в Spring Boot.
С помощью Spring Cloud Task вы получаете процесс JVM по требованию, который выполняет задачу и немедленно завершается.
В этой статье мы будем много ссылаться на официальный проект Spring Cloud Task, доступный на Github .
Техническая архитектура задачи Spring Cloud
Задача Spring Cloud использует несколько аннотаций для настройки системы и базы данных (по крайней мере, для производства) для записи результата каждого вызова.
Чтобы сделать приложение Spring Boot облачной задачей, вам необходимо аннотировать один из классов конфигурации вашего приложения с помощью @EnableTask
.
Эта аннотация импортирует конфигурацию жизненного цикла задачи в ваш проект. Класс Конфигурация жизненного цикла задачи
– это класс конфигурации для TaskLifecycleListener
, Репозитория задач
и других полезных классов, необходимых для реализации всех функций задачи Spring Cloud.
Реализация
Инициализация Пружины
Хороший способ начальной загрузки вашего проекта загрузки каркасной пружины-использовать Spring Initializr . Выберите предпочитаемую зависимость от базы данных, зависимость от задачи Spring Cloud и зависимость JPA для данных Spring:
Если у вас уже запущен проект с использованием Maven, добавьте соответствующие зависимости:
org.springframework.cloud spring-cloud-starter-task ${version} org.springframework.boot spring-boot-starter-data-jpa ${version} org.postgresql postgresql ${version}
Зависимость spring-cloud-starter-task
включает spring-boot-starter
, spring-cloud-ядро задачи
, пакет задач spring-cloud-
и поток задач spring-cloud -|/.
Зависимость spring-cloud-task-core
является основной, которую мы будем использовать – вы можете импортировать spring-boot-starter
и предыдущую зависимость отдельно.
В качестве альтернативы, если вы используете Gradle:
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-task', version: '2.2.3.RELEASE'
Настройка приложения
Чтобы зарегистрировать приложение в качестве задачи Spring Cloud, вам необходимо аннотировать один из классов конфигурации с помощью @EnableTask
:
@EnableTask @SpringBootApplication public class SampleSpringCloudTaskApplication { public static void main(String[] args) { SpringApplication.run(SampleSpringCloudTaskApplication.class, args); } }
Поскольку @SpringBootApplication
аннотация представляет собой комбинацию @EnableAutoConfiguration
, @Конфигурации
и @ComponentScan
, совершенно нормально аннотировать основной класс с помощью @EnableTask
аннотации.
Хранилище задач
Задача может быть создана без базы данных. В этом случае он использует экземпляр H2 в памяти для управления событиями репозитория задач. Это хорошо для разработки, но не для производства. Для производства рекомендуется использовать источник данных. Он сохраняет все записи о выполнении ваших задач и ошибках.
Все события задачи сохраняются с помощью Репозитория задач
.
В проекте с одним источником данных задача Spring Cloud создает таблицы задач в указанной базе данных.
Однако в проекте с несколькими источниками данных вам необходимо выбрать источник данных для использования с задачей Spring Cloud. Пример проекта с несколькими источниками данных можно найти в примерах проектов Spring Cloud Task|/.
В примере 2 источника данных указаны в классе Конфигурация источника данных
:
@Configuration public class DataSourceConfiguration { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .build(); } @Bean public DataSource secondDataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .build(); } }
Чтобы указать источник данных, который будет использоваться задачей Spring Cloud, создается Настраиваемая задача, настроенная
компонентом. Он расширяет конфигуратор задач по умолчанию
, передавая квалифицированный источник данных в конструктор:
@Component public class CustomTaskConfigurer extends DefaultTaskConfigurer { @Autowired public CustomTaskConfigurer(@Qualifier("secondDataSource") DataSource dataSource) { super(dataSource); } }
Если пользовательское Хранилище задач
не указано путем расширения Репозитория простых задач
, репозиторий Простых задач
является хранилищем задач по умолчанию
, используемым задачей Spring Cloud.
Настройка задачи
Настроенная задача
используется для настройки конфигураций задач Spring Cloud. Конфигурация задачи по умолчанию
используется конфигурация по умолчанию, если не предусмотрен пользовательский конфигуратор задач, реализующий интерфейс TaskConfigurer
.
Конфигурация задачи по умолчанию
предоставляет компоненты на основе карт, если источник данных недоступен, и компоненты JDBC, если источник данных предоставлен.
Обозреватель задач
Проводник задач
, как следует из его названия, является проводником для выполнения задач. Это полезно для сбора фактической информации о задачах из хранилища задач.
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
По умолчанию в задачах Spring Cloud используется Простой обозреватель задач
.
Из Обозревателя задач
вы можете запросить много полезной информации о выполнении задач , например , общее количество задач
, выполняемых в данный момент задач
, поиск всех задач
и т. Д.
Выполнение задачи
Выполнение задачи
– это состояние Задачи для каждого Выполнения . Вся информация, хранящаяся в репозитории Задач
, моделируется в этом классе. Это базовая единица для каждой задачи.
Часть хранящейся информации является
идентификатор выполнения
– Уникальный идентификатор, связанный с выполнением задачи.код выхода
– Записанный код выхода для задачи.имя задачи
– определяемое пользователем имя задачи.время начала
– Время начала задачи.Время окончания
– Метка времени завершения задачи.
Выполнение задачи
Чтобы выполнить нашу задачу, мы должны реализовать интерфейс Runner
и предоставить его в качестве компонента в нашем классе конфигурации.
Обычно реализуется Запуск командной строки
или Запуск приложения
:
@Component public class SampleCommandLineRunner implements CommandLineRunner { @Override public void run(String...args) throws Exception { System.out.println("Specified Task"); } } @Configuration public class TaskConfiguration { @Bean public SampleCommandLineRunner sampleCommandLineRunner() { return new SampleCommandLineRunner(); } }
И с помощью этого, используя метод main
, мы можем вызвать Пример выполнения командной строки
:
@SpringBootApplication public class SomeApplication { public static void main(String[] args) { SpringApplication.run(SampleCommandLineRunner.class, args); } }
Список задач
Все Выполнение задач
имеют жизненный цикл. Задача Spring Cloud записывает эти события. В начале задачи, перед запуском любых реализаций Runner
интерфейса, создается запись в репозитории Задач
, в которой записывается событие запуска.
Когда задача выполнена или выполнена неудачно, генерируется другое событие. TaskExecutionListener
позволяет регистрировать слушателей для прослушивания этого события на протяжении всего жизненного цикла.
Вы можете указать столько слушателей, сколько захотите, для одного и того же события.
Spring предоставляет два подхода для этого – с использованием интерфейса TaskExecutionListener
или подхода к аннотации компонента метода.
Для первого вы предоставляете компонент, реализующий интерфейс TaskExecutionListener
и его три метода:
void onTaskStartup(TaskExecution taskExecution); void onTaskEnd(TaskExecution taskExecution); void onTaskFailed(TaskExecution taskExecution, Throwable throwable);
при запуске задачи()
– Вызывается после того, какВыполнение задачи
было сохранено вХранилище задач
.onTaskEnd()
– Вызывается после того , какВыполнение задачи
было обновлено вХранилище задач
по завершении задачи.onTaskFailed()
– Вызывается, если во время выполнения задачи возникает неперехваченное исключение.
С другой стороны, используя метод аннотации компонента, вы создаете компонент и предоставляете его в качестве компонента в конфигурации Spring:
@Configuration public class AppConfigurtion { @Bean public AppTaskListener appTaskListener() { return new AppTaskListener(); } } @Component class AppTaskListener { @BeforeTask public void beforeTaskInvocation(TaskExecution taskExecution) { System.out.println("Before task"); } @AfterTask public void afterTaskInvocation(TaskExecution taskExecution) { System.out.println("After task"); } @FailedTask public void afterFailedTaskInvocation(TaskExecution taskExecution, Throwable throwable) { System.out.println("Failed task"); } }
@@BeforeTask
аналогиченпри запуске задачи()
.@AfterTask
аналогиченonTaskEnd()
.@FailedTask
аналогиченonTaskFailed()
.
Сообщения о выходе из задачи
Хотя вы можете указать любое количество прослушивателей для конкретного события, если обработчик событий TaskExecutionListener
создает исключение, вся обработка прослушивателя для этого обработчика событий останавливается.
Например, если три |/при запуске задачи() прослушиватели запущены и
первый при запуске задачи() обработчик событий выдает исключение, другие
два | onTaskStartup методы не вызываются.
Однако вызываются другие обработчики событий ( onTaskEnd()
и onTaskFailed()
) для прослушивателей Выполнения задач
.
При возникновении исключений TaskExecutionListener
возвращает код выхода и сообщение о выходе. Аннотирование метода с помощью @Aftertax
позволит нам установить сообщение о выходе:
@AfterTask public void afterError(TaskExecution taskExecution) { taskExecution.setExitMessage("Custom Exit Message"); }
Сообщение о выходе может быть задано в любом из событий прослушивателя, хотя будут заданы только соответствующие сообщения. Если задача выполняется успешно, событие onTaskFailed()
не сработает. Когда задача завершается, устанавливается сообщение от события onTaskEnd ()
.
Настройка Облачной Задачи
Многие свойства могут быть переопределены Заданной задачей
путем указания пользовательских значений в applications.properties
или приложениях.yaml
файл.
Свойства задачи Spring cloud имеют префикс spring.cloud.задача
в файле applications.properties
.
Некоторые из свойств, которые можно переопределить, следующие:
Префикс spring.cloud.task.table
– Это префикс таблицы для таблиц задач дляРепозитория задач
. Префикс таблицы по умолчанию – ”TASK_"
.spring.cloud.task.initialize-включено=false
– Используется для включения или отключения создания таблиц задач при запуске задачи. По умолчанию установлено значение true.идентификатор spring.cloud.task.execution=идентификатор вашей задачи
– Используется для настройки задачи Spring Cloud для использования вашего пользовательского идентификатора задачи. По умолчанию spring генерирует идентификатор выполнения задачи для каждого выполнения задачи.
Чтобы просмотреть дополнительные настраиваемые свойства, проверьте задать свойства
.
Регистрация Событий Облачных Задач
Обычно во время разработки полезно просматривать журналы отладки приложений. Чтобы изменить уровень ведения журнала для задачи Spring Cloud, добавьте это в свой файл applications.properties
:
logging.level.org.springframework.cloud.task=DEBUG
Вывод
В этой статье мы представили задачу Spring Cloud, что это такое и какие проблемы она решает. Мы также рассмотрели примеры того, как настроить его с источником данных и запустить задачу с помощью интерфейсов Runner
.
Кроме того, мы объяснили архитектуру задач Spring Cloud и все модели предметной области, такие как Выполнение задач
, Список задач
и т.д., Используемые для достижения всех функциональных возможностей.