Вы видели интегрированный Quartz таким образом?

Spring Boot

Знания меняют судьбу, мастурбация делает меня счастливым, как твоя прическа в 2019 году?
Ставьте лайк и смотрите снова, формируйте привычку
Эта статья соответствует облачному хранилищу исходного кода (Gitee).
git ee.com/min-exploitation-pro т.е..., твоя Звезда для меня самая большая мотивация

QuartzЭто отличная структура планирования задач, которая поддерживает память и JDBC для хранения списков невыполненных задач, поддерживает несколько узлов задач для одновременного выполнения задач и поддерживает перенос задач на разные узлы для выполнения.

предисловие

Я думаю, что такая превосходная структура планирования задач должна быть предпочтительным решением для многих разработчиков, поэтомуApiBootНачал с него, основываясьSpringBootупаковано по имениApiBoot Quartzкомпоненты, а также черезapplication.ymlФорма файла конфигурации может просто реализовать интеграцию инициализации.

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

Ссылки, связанные с ApiBoot, необходимые для этой статьи:

Как хранить задачи

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:


автор личноблогИспользуйте фреймворк с открытым исходным кодомApiBootПомочь вам стать архитектором сервисов интерфейса API