Знания меняют судьбу, мастурбация делает меня счастливым, как твоя прическа в 2019 году?
Ставьте лайк и смотрите снова, формируйте привычку
Эта статья соответствует облачному хранилищу исходного кода (Gitee).
git ee.com/min-exploitation-pro т.е..., твоя Звезда для меня самая большая мотивация
Quartz
Это отличная структура планирования задач, которая поддерживает память и JDBC для хранения списков невыполненных задач, поддерживает несколько узлов задач для одновременного выполнения задач и поддерживает перенос задач на разные узлы для выполнения.
предисловие
Я думаю, что такая превосходная структура планирования задач должна быть предпочтительным решением для многих разработчиков, поэтомуApiBoot
Начал с него, основываясьSpringBoot
упаковано по имениApiBoot Quartz
компоненты, а также черезapplication.yml
Форма файла конфигурации может просто реализовать интеграцию инициализации.
Если мы используем конфигурацию по умолчанию, мы не можем написать ни строчки кода, связанного с интеграцией,ApiBoot Quartz
Он также предоставляет интерфейс для методов, которые часто используются в повседневной жизни, таких как: создание задач, приостановка задач, возобновление задач, удаление задач и т. д.
Ссылки, связанные с ApiBoot, необходимые для этой статьи:
- Официальный сайт ApiBoot
- Статьи из серии полных компонентов ApiBoot
- Репозиторий исходного кода ApiBoot Gitee (приветствуется участник)
- Репозиторий исходного кода ApiBoot GitHub (приветствуется участник)
Как хранить задачи
Quartz
Он предоставляет два способа хранения задач:
-
Memory
: режим памяти, в котором задачи хранятся в памяти, которые будут потеряны при перезапуске проекта.Не рекомендуется для производственных сред. -
Jdbc
: режим базы данных, хранить задачи вQuartz
В предоставленной таблице с фиксированной структурой задача перезапуска проекта не будет потеряна. Пожалуйста, посетите:Quartz SchemasВыбирайте по требованию.
ApiBoot
БудуQuartz
Два метода хранения, представленные в пакете, инкапсулированыapi.boot.quartz.job-store-type
параметр для настройки, значение по умолчанию для этого параметраmemory
, поэтому, если вы используете метод памяти, этот параметр не нужно изменять.ApiBootQuartzPropertiesПроверить.
тип задачи
Тип задачиApiBoot Quartz
Фактически новая концепцияQuartz
Между задачами нет различий по типам.org.quartz.Job
Интерфейс для создания задачи.
ноSpring
Он также любит бросать, и он упакован, чтобы обеспечитьQuartzJobBean
, это абстрактный класс, мы также можем создать временную задачу после наследования этого класса.
существуетApiBoot Quartz
Есть три типа задач, а именно:
- OnceJob: тип задачи, которая выполняется только один раз
- CronJob: Используйте выражения Cron для определения цикла выполнения задачи.
- LoopJob: задача, которая может указать количество циклов, будет выполняться повторно в соответствии с указанным количеством циклов.
встроенный метод
ApiBoot
упаковкаQuartz
После того, как предоставленные методы находятся вApiBootQuartzServiceинтерфейс, который имеет класс реализации по умолчаниюApiBootQuartzServiceDefaultSupport, все классы реализации реализуют методы определения интерфейса, а внутренниеorg.quartz.Scheduler
выполнять основные операции задачи.
Список встроенных методов:
метод | описывать |
---|---|
Scheduler getScheduler(); | Получите экземпляр планировщика внутри контейнера SpringIoc |
String newJob(ApiBootJobWrapper jobWrapper); | Создайте новую задачу через инкапсулированный объект, который является точкой входа для создания всех типов задач. |
void deleteJob(String jobKey); | удалить задачу |
void deleteJobs(String... jobKeys); | удалить серию задач |
void deleteJobs(Collection jobKeys); | удалить все задачи в коллекции |
void pauseJob(String jobKey); | Приостановить задачу |
void pauseJobs(String... jobKeys); | Приостановить все пройденные задачи |
void pauseJobs(Collection jobKeys); | Приостановить все задачи в коллекции |
void resumeJob(String jobKey); | Возобновить выполнение задачи |
void resumeJobs(String... jobKeys); | Возобновить выполнение всех задач в массиве |
void resumeJobs(Collection jobKeys); | Возобновить выполнение всех задач в коллекции |
void updateJobCron(String jobKey, String cron); | Обновить выражение задачи Cron |
void updateJobStartTime(String jobKey, Date jobStartTime); | Обновить время начала задачи |
void startAllJobs(); | Запустить все запланированные задачи |
void shutdownAllJobs(); | Закрыть все запланированные задачи |
теперь, когдаApiBoot
Предоставляет нам так много встроенных методов, давайте создадим проект, чтобы почувствовать его.
Пример проекта
использоватьIdea
СоздаватьSpringBoot
проект, мы добавляем зависимости, требуемые в этой главе, вpom.xml
внутри файла следующим образом:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--ApiBoot Quartz-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<!--ApiBoot统一版本-->
<dependency>
<groupId>org.minbox.framework</groupId>
<artifactId>api-boot-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
Уведомление:
ApiBoot
версия основана наSpringBoot
определяется версией , см.Ветка версии ApiBoot
Пример класса задач
Давайте создадимDemoJob
Пример класса планирования задач выглядит следующим образом:
/**
* 示例任务
*
* @author 恒宇少年
*/
public class DemoJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任务执行了..");
}
}
Что такое QuartzJobBean?
QuartzJobBean
КSpring
обеспечивать, реализовыватьorg.quartz.Job
интерфейс даQuartz
Реализация и инкапсуляция встроенного интерфейса задачи.
Преимущества QuartzJobBean
Spring
При условииQuartzJobBean
Каковы конкретные преимущества?
-
Автоматически добавлять экземпляр класса реализации в IOC
использовать
QuartzJobBean
создать пользовательскую задачу,Spring
Он автоматически просканирует классы реализации в проекте, создаст экземпляр каждого класса реализации с помощью механизма отражения и запишет экземпляр вIOC
внутри контейнера. -
Экземпляры могут быть внедрены внутри реализующего класса
Использовать напрямую
Quartz
, если экземпляр пользовательского класса задач не добавленIOC
контейнер, мы не можем внедрить в пользовательский класс задачService, понимаю этоSpring
Все учащиеся начальных классов должны понимать, что мы не можемIOC
Операция внедрения выполняется внутри управляемого класса, и использованиеQuartzJobBean
Не принимайте это во внимание.
Процесс регистрации QuartzJobBean
использоватьApiBoot Quartz
Почему не нужно вручную добавлять инъекцию и добавлять класс реализации задачи вIOC
контейнер?
Процесс регистрации класса задач выглядит следующим образом:
-
Шаг 1: ApiBootQuartzAutoConfiguration#quartzScheduler()
ApiBoot
в интеграцииQuartz
предоставляет класс автоматической конфигурацииApiBootQuartzAutoConfiguration, в этом классе поquartzScheduler()
способ автоматического созданияSchedulerFactoryBean
пример -
Шаг 2: SchedulerFactoryBean#setJobFactory()
пройти через
SchedulerFactoryBean
предоставляется в течениеsetJobFactory()
Метод может быть настроен для конкретного использованияJobFactory
класс реализации, в то время как вspring-context-support
Соответствующая реализация была предоставлена в зависимости, названнойSpringBeanJobFactory
. -
Шаг 3: SpringBeanJobFactory#createJobInstance()
Когда проект стартует, все сканируется
QuartzJobBean
Класс реализации черезJobFactory#newJob
метод для создания экземпляра задачи и доставки экземпляра вQuartz
Платформа выполняет планирование задач на более позднем этапе подготовки.
SpringBeanJobFactory
класс наследуется отAdaptableJobFactory
класс, покаAdaptableJobFactory
реализуетсяJobFactory
интерфейс, поэтому, если мы поместимSpringBeanJobFactory
установлен вSchedulerFactoryBean
Когда проект стартуетQuartz
позвонюSpringBeanJobFactory#createJobInstance()
метод для создания экземпляра задачи.
пока вcreateJobInstance()
в рамках методаSpring
Затем созданный экземпляр задачи сохраняется вIOC
В контейнере, чтобы наша пользовательская задача могла внедрять другие компоненты.Исходный код этого метода выглядит следующим образом:
/**
* Create the job instance, populating it with property values taken
* from the scheduler context, job data map and trigger data map.
*/
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object job = (this.applicationContext != null ?
// 通过ApplicationContext创建任务实例,并添加到IOC
this.applicationContext.getAutowireCapableBeanFactory().createBean(
bundle.getJobDetail().getJobClass(), AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false) :
super.createJobInstance(bundle));
if (isEligibleForPropertyPopulation(job)) {
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(job);
MutablePropertyValues pvs = new MutablePropertyValues();
if (this.schedulerContext != null) {
pvs.addPropertyValues(this.schedulerContext);
}
pvs.addPropertyValues(bundle.getJobDetail().getJobDataMap());
pvs.addPropertyValues(bundle.getTrigger().getJobDataMap());
if (this.ignoredUnknownProperties != null) {
for (String propName : this.ignoredUnknownProperties) {
if (pvs.contains(propName) && !bw.isWritableProperty(propName)) {
pvs.removePropertyValue(propName);
}
}
bw.setPropertyValues(pvs);
}
else {
bw.setPropertyValues(pvs, true);
}
}
return job;
}
ГрубоQuartzJobBean
Процесс регистрации класса реализации выглядит так: давайте посмотрим, действительно ли создать и выполнить задачу так просто.
запустить тест
Для удобства демонстрации модифицируемXxxApplication
Начальный класс, пусть проект выполняется автоматически после запускаDemoJob
задачи следующим образом:
@SpringBootApplication
public class ApibootQuartzIntegratedAwayApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(ApibootQuartzIntegratedAwayApplication.class, args);
}
/**
* ApiBoot Quartz内置方法接口
* {@link org.minbox.framework.api.boot.plugin.quartz.support.ApiBootQuartzServiceDefaultSupport}
*/
@Autowired
private ApiBootQuartzService quartzService;
@Override
public void run(String... args) throws Exception {
quartzService.newJob(ApiBootOnceJobWrapper.Context()
.jobClass(DemoJob.class)
.wrapper());
}
}
CommandLineRunner
КSpringBoot
Предоставляет логику для выполнения после запуска проекта.
Вывод консоли после запуска проекта выглядит следующим образом:
......
任务执行了..
Внимательные студенты должны видеть, что мы использовалиApiBootOnceJobWeapper
Объект задачи, созданный этим классом инкапсуляции, мы поговорим о том, что может делать этот класс инкапсуляции в следующей главе?
Постучать по доске, нарисовать ключ
Quartz
Это отличная распределенная структура планирования задач.ApiBoot
Инкапсулируя его, добавляя крылья, давайте поймем еще один уровень определения простоты.
пример кода
Если вам понравилась эта статья, нажмите на репозиторий исходного кодаStar
,Спасибо! ! !
Образец исходного кода этой статьи можно получить по следующим каналам, каталогapiboot-quartz-integrated-away
:
- Гостиница:git ee.com/min-exploitation-pro т.е...
автор личноблогИспользуйте фреймворк с открытым исходным кодомApiBootПомочь вам стать архитектором сервисов интерфейса API