Изучите эти 10 видов задач на время, я немного плаваю

Java

предисловие

Недавно несколько читателей прислали мне личные сообщения и спросили, какие запланированные задачи использовать в своих бизнес-сценариях. Это правда, что нам нужно использовать разные запланированные задачи в разных бизнес-сценариях, но у нас все еще есть довольно много вариантов. Сегодня я подытожу для вас 10 очень практичных заданий на время, и всегда найдется одно, подходящее именно вам.

1. Запланированные задачи, которые поставляются с Linux

crontab

Не знаю, сталкивались ли вы с таким сценарием: иногда нужно временно подсчитать данные в строке, а потом экспортировать в экселевский лист. Этот вид запроса иногда бывает более сложным, и недостаточно написать только операторы sql, что требует написания кода java. Затем введите программу в пакет jar, запустите ее в онлайн-среде и, наконец, загрузите сгенерированный файл Excel на локальный компьютер.

Чтобы уменьшить влияние на онлайн-среду, мы обычно выбираем凌晨1-2点, когда число пользователей невелико, выполняется статистическая программа. (На самом деле около 4 утра пользователей меньше всего)

Поскольку уже слишком поздно, нам не нужно ждать там и ждать результата выполнения, можно выполнить запланированное задание.

Итак, этот вид обычных задач больше подходит?

ответ:linuxсистематическийcrontab. (Однако не исключается, что некоторые проекты не развернуты в системе linux)

бегатьcrontab -e, вы можете отредактировать таймер, а затем добавить следующие команды:

0 2 * * * /usr/local/java/jdk1.8/bin/java -jar /data/app/tool.jar > /logs/tool.log &

ты сможешь每天凌晨2点,Выполнение по времениtool.jarпрограмму и вывести журнал вtool.logв файле. Конечно, вы также можете написать обратную сторону Java-программы в сценарии оболочки, что более удобно в обслуживании.

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

Основной формат команды crontab следующий:

crontab [参数] [文件名]

Если имя файла не указано, принимает команду, введенную с клавиатуры, и загружает ее вcrontab.

Таблица сравнения функций параметров выглядит следующим образом:

image.png

Вышеуказанные параметры, если они не используются-uУкажите пользователя, текущий пользователь используется по умолчанию.

пройти черезcrontab -eКоманда для редактирования содержимого файла, конкретный синтаксис выглядит следующим образом:

[分] [小时] [日期] [月] [星期] 具体任务

в:

  • Минуты, указывающие, сколько минут, диапазон: 0-59

  • Часы, указывающие, сколько часов, диапазон: 0-23

  • Дата с указанием конкретного дня, диапазон: 1-31

  • Месяц, указывающий, сколько месяцев, диапазон: 1-12

  • Неделя, указывающая, сколько недель, диапазон: 0-7, 0 и 7 оба представляют воскресенье.

Есть также некоторые специальные символы, такие как:

  • *Представляет время, например:*1***Указывает, что выполняется в 1:00 каждый день.

  • /Представляет, как часто он выполняется, например:*/5 ****Указывает, что выполняется каждые 5 минут.

  • ,Представители поддерживают множественные, такие как:10 7,9,12 ***Указывает, что выполняется один раз в день в 7, 9 и 12:10.

  • -Представляет поддержку диапазона, например:10 7-9 ***Указывает, что он будет выполняться один раз в день в 7, 8 и 9:10.

Также, кстатиcrontabнеобходимостьcrondслужба поддержки,crondдаlinuxПроцесс-демон, используемый для периодического выполнения определенных задач во время установки.linuxПосле операционной системы она будет установлена ​​по умолчаниюcrondсервисный инструмент иcrondСлужба по умолчанию запускается автоматически.crondПроцесс периодически каждую минуту проверяет, есть ли задача для выполнения, и если да, выполняет задачу автоматически.

Связанными службами можно управлять с помощью следующих команд:

service crond status // 查看运行状态
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置

использоватьcrontabПреимущества и недостатки:

  • Преимущества: Удобно изменять правила синхронизации, поддерживает некоторые более сложные правила синхронизации и может управлять всеми видами сценариев синхронизации, подготовленных через файлы.

  • Недостатки: Если запланированных задач слишком много, их нелегко найти, и операционная система должна быть обязательно запущена.linux, иначе он не может быть выполнен.

2. Запланированные задачи, поставляемые с jdk

1.Thread

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

Конкретный код для реализации этой задачи синхронизации выглядит следующим образом:

public static void init() {
    new Thread(() -> {
        while (true) {
            try {
                System.out.println("doSameThing");
                Thread.sleep(1000 * 60 * 5);
            } catch (Exception e) {
                log.error(e);
            }
        }
    }).start();
}

использоватьThreadКласс может выполнять самые простые задания на время, вrunметод имеетwhileбесконечный цикл (конечно, есть и другие способы), выполняющий собственные задачи. Одна вещь, которая требует особого внимания, это то, что вам нужно использоватьtry...catchПерехватите исключение, иначе, если возникнет исключение, цикл будет прерван напрямую, и в следующий раз выполнение не продолжится.

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

Кроме того, поток может быть определен как守护线程, просто выполните молча в фоновом режиме.

Сценарии использования: Например, в проекте иногда необходимо загружать определенный файл каждые 10 минут, или читать файл шаблона каждые 5 минут для генерации статических html-страниц и т.д., какие-то простые периодические сценарии задач.

использоватьThreadПлюсы и минусы класса:

  • Преимущества: Этот вид задач на время очень прост, стоимость обучения низкая, и его легко начать Это хороший выбор для этих простых периодических задач.

  • Недостатки: не поддерживает указанные задачи некоторое время, не поддерживает функцию задержки выполнения операции через один, не удается справиться с некоторыми из более сложных сцен.

2.Timer

TimerКласс представляет собой инструмент таймера, специально предоставленный jdk, который используется для планирования выполнения определенных задач в фоновом потоке.java.utilупаковать, следоватьTimerTaskИспользуйте вместе.

图片

TimerКласс на самом деле является планировщиком задач, который содержитTimerThreadНить, в этой нити цикл бесконечно изTaskQueueполучено вTimerTask(Этот класс реализует интерфейс Runnable), вызывая егоrunметод для асинхронного выполнения задач по времени. нам нужно унаследоватьTimerTaskкласс, который его реализуетrunи добавьте к этому методу собственную бизнес-логику.

Конкретный код для реализации этой задачи синхронизации выглядит следующим образом:

public class TimerTest {

    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("doSomething");
            }
        },2000,1000);
    }
}

сначала создайте экземплярTimerкласс, а затем вызовите егоscheduleМетод в методе ПримераTimerTaskкласс, бизнес-логика написана наrunметод.scheduleПоследние два параметра метода представляют:延迟时间и间隔时间, в миллисекундах. В приведенном выше примере заданная задача по времени выполняется каждую 1 секунду с задержкой в ​​2 секунды.

В основном включает 6 методов:

  • schedule(TimerTask task, Date time), указанная задача задача выполняется в указанное время время

  • schedule(TimerTask task, long delay)Укажите выполнение задач задачи после уточнения задержки

  • schedule(TimerTask task, Date firstTime,long period), После выполнения указанной задачи задачи в указанное время firstTime повторите выполнение с фиксированной частотой задержки peroid

  • schedule(TimerTask task, long delay, long period), Укажите задачу задачи, чтобы повторить выполнение peroid с фиксированной частотой задержки после указанной задержки задержки.

  • scheduleAtFixedRate(TimerTask task,Date firstTime,long period), После того, как указанная задача задачи будет выполнена в указанное время firstTime, она будет повторять выполнение с фиксированной частотой задержки peroid

  • scheduleAtFixedRate(TimerTask task, long delay, long period), Укажите задачу задачи, чтобы повторить выполнение peroid с фиксированной частотой задержки после указанной задержки задержки.

Но используйтеTimerРеализация задач на время имеет следующие проблемы:

  1. так какTimerЭто однопоточная задача выполнения, если одна из задач занимает много времени, это повлияет на выполнение других задач.

  2. еслиTimerTaskбросатьRuntimeException, Таймер остановит выполнение всех задач.

использоватьTimerПлюсы и минусы класса:

  • Преимущества: очень удобно реализовывать несколько периодических задач синхронизации, поддерживает отложенное выполнение, а также поддерживает поддержку по истечении заданного времени, что довольно мощно.

  • Минусы: если задача занимает очень много времени, это повлияет на выполнение других задач. и еслиTimerTaskбросатьRuntimeException,TimerЭто остановит выполнение всех задач, поэтому не рекомендуется использовать его в спецификации разработчика Alibaba.

3.ScheduledExecutorService

ScheduledExecutorServiceЭто задача на время, представленная в версии JDK1.5+. Этот класс находится вjava.util.concurrentПод параллельным пакетом.

ScheduledExecutorServiceОн основан на многопоточности, и первоначальная цель проекта состоит в том, чтобы решитьTimerОднопоточное выполнение, проблема в том, что несколько задач будут влиять друг на друга.

В основном он содержит 4 метода:

  • schedule(Runnable command,long delay,TimeUnit unit), Планирование с задержкой выполняется только один раз, и после планирования оно может быть заблокировано Future.get() до тех пор, пока задача не будет выполнена.

  • schedule(Callable<V> callable,long delay,TimeUnit unit), Планирование с задержкой выполняется только один раз.После планирования оно может быть заблокировано Future.get() до тех пор, пока задача не будет выполнена и не будет получен результат выполнения.

  • scheduleAtFixedRate, что указывает на то, что задача выполняется с фиксированной периодичностью.Если текущая задача занимает много времени и превышает временной период, текущая задача будет выполнена сразу после окончания.

  • scheduleWithFixedDelay, указывающее, что задача выполняется с фиксированной задержкой, а задержка относится к концу текущей задачи в качестве отправной точки для расчета времени начала.

Конкретный код для реализации этой задачи синхронизации выглядит следующим образом:

public class ScheduleExecutorTest {

    public static void main(String[] args) {
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("doSomething");
        },1000,1000, TimeUnit.MILLISECONDS);
    }
}

перечислитьScheduledExecutorServiceКатегорияscheduleAtFixedRateМетод реализует периодические задачи, которые выполняются каждую 1 секунду и каждый раз выполняются с задержкой в ​​1 секунду.

Эта временная задача используется в спецификации разработчика Alibaba для заменыTimerСхема классов — хороший выбор для многопоточного выполнения периодических задач.

Преимущества и недостатки ScheduledExecutorService:

  • Преимущества: на основе многопоточных задач синхронизации несколько задач не будут зависеть от корреляции, поддерживают периодическое выполнение задач и имеют функцию задержки.

  • Недостаток: некоторые более сложные правила синхронизации не поддерживаются.

3. Spring поддерживает временные задачи

1.spring task

spring taskдаspring3Задачи синхронизации, которые поставляются с вышеуказанными версиями, необходимо ввести при реализации функции задач синхронизации.spring-contextпакет, в настоящее время он поддерживает:xmlи注解Два пути.

1. Боевой проект

Поскольку xml слишком устарел, в качестве примера мы используем режим аннотации проекта Springboot.

первый шаг, представленный в файле pom.xmlspring-contextродственные зависимости.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
</dependency>

второй шаг, добавьте класс запуска Springboot@EnableSchedulingаннотация.

@EnableScheduling
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(WebApplicationType.SERVLET).run(args);
    }
}

третий шаг,использовать@ScheduledАннотации определяют правила синхронизации.

@Service
public class SpringTaskTest {

    @Scheduled(cron = "${sue.spring.task.cron}")
    public void fun() {
        System.out.println("doSomething");
    }
}

четвертый шаг,существуетapplicationContext.propertiesПараметры конфигурации в файле:

sue.spring.task.cron=*/10 * * * * ?

Это будет выполнять забавный метод каждые 10 секунд.

2. правила cron

В версиях выше spring 4 выражение cron содержит 6 параметров:

[秒] [分] [时] [日期] [月] [星期]

Также поддерживаются несколько часто используемых специальных символов:

  • *: Указывает, что задача запускается в любое время.

  • ,: Указывает, что указанное время запускает задачу.

  • -: Указывает, что задача запущена в течение определенного периода времени.

  • /: Спектакль, с которого начинается время, один раз на долгое время запускает задачу.

  • ?: Указывает, что два поддиражения, используемые в день месяца и дня недели, указывающие на то, что значение не указано.

Конкретное значение параметров выражения cron:

  1. Во-вторых, диапазон значений: 0-59, поддержка*,,,-,/.

  2. баллы, диапазон значений: 0-59, поддержка*,,,-,/.

  3. время, диапазон значений: 0-23, поддержка*,,,-,/.

  4. Дата, диапазон значений: 1-31, поддержка*,,,-,/. более секунды?, указывающее, что если указанный星期срабатывает, настроен日期становится недействительным.

  5. месяц, диапазон значений: 1-12, поддержка*,,,-,/.

  6. Неделя, диапазон значений: 1~7, 1 — воскресенье, 6 — суббота и т. д. служба поддержки*,,,-,/,?. более секунды?, указывающее, что если указанный日期срабатывает, настроенный星期становится недействительным.

Распространенное выражение cron Пример:

  • 0 0 0 1 * ?Выполняется в 0:00 1-го числа каждого месяца

  • 0 0 2 * * ?Выполняется каждый день в 2 часа ночи

  • 0 0 2 * * ?Выполняется каждый день в 2 часа ночи

  • 0 0/5 11 * * ?11:00-11:55 ежедневно, каждые 5 минут

  • 0 0 18 ? * WEDВыполняется каждую среду в 18:00

Задача spring сначала анализирует и собирает с помощью метода processScheduled класса ScheduledAnnotationBeanPostProcessor.ScheduledПараметры аннотации включены: выражение CRON.

Затем в методе afterPropertiesSet класса ScheduledTaskRegistrar инициализируйте однопоточныйThreadPoolExecutorвыполнять задания.

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

использоватьspring taskПреимущества и недостатки:

  • Преимущества: Функция синхронизации, которая поставляется с инфраструктурой Spring, Springboot сделала очень хорошую инкапсуляцию, ее очень легко открывать и определять задачи синхронизации, и она поддерживает сложныеcronВыражение, чтобы удовлетворить подавляющее большинство автономных бизнес-сценариев. При одной задаче после текущего времени запланировано, то выполните следующее планирование задач.

  • Недостатки: По умолчанию используется однопоточность.Если время выполнения предыдущей задачи слишком велико, это повлияет на выполнение последующей задачи. Он не поддерживает развертывание кластера и не может выполнять запланированные задачи хранения данных.

2.spring quartz

quartzдаOpenSymphonyОрганизации с открытым исходным кодом вJob schedulingПроект с открытым исходным кодом в этой области представляет собой систему управления расписанием задач с открытым исходным кодом, разработанную java.

Что может кварц?

  • Планирование заданий: вызывать сценарии заданий различных фреймворков, таких как shell, hive и т. д.

  • Запланированные задачи: в заранее определенном времени выполните задачи, которые вы хотите выполнить.

Схема архитектуры выглядит следующим образом:

图片

Основные интерфейсы, включенные в кварц, следующие:

  • SchedulerПредставляет контейнер планирования. В контейнере планирования можно зарегистрировать несколько JobDetails и Triggers.

  • JobПредставляет собой работу, т. е. конкретное содержание, которое необходимо выполнить.

  • JobDetailПредставляет конкретный исполняемый планировщик, а Job — это содержимое, которое должно выполняться исполняемым планировщиком.

  • JobBuilderИспользуется для определения или создания экземпляра JobDetail.

  • TriggerПредставляет триггер планирования, который определяет, когда его запланировать.

  • TriggerBuilderИспользуется для определения или создания триггеров.

  • JobStoreИспользуется для хранения состояния во время планирования заданий и задач.

1. Спроектируйте реальный бой

мы все еще используемspringbootинтегрированныйquartzНапример.

первый шаг, представленный в файле pom.xmlquartzродственные зависимости.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

второй шаг, создайте класс выполнения задач в реальном времени, этот класс наследуетQuartzJobBean.

public class QuartzTestJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        String userName = (String) context.getJobDetail().getJobDataMap().get("userName");
        System.out.println("userName:" + userName);
    }
}

третий шаг, чтобы создать планировщикJobDetailи планировщикTrigger.

@Configuration
public class QuartzConfig {
    @Value("${sue.spring.quartz.cron}")
    private String testCron;

    /**
     * 创建定时任务
     */
    @Bean
    public JobDetail quartzTestDetail() {
        JobDetail jobDetail = JobBuilder.newJob(QuartzTestJob.class)
                .withIdentity("quartzTestDetail", "QUARTZ_TEST")
                .usingJobData("userName", "susan")
                .storeDurably()
                .build();
        return jobDetail;
    }

    /**
     * 创建触发器
     */
    @Bean
    public Trigger quartzTestJobTrigger() {
        //每隔5秒执行一次
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(testCron);

        //创建触发器
        Trigger trigger = TriggerBuilder.newTrigger()
                .forJob(quartzTestDetail())
                .withIdentity("quartzTestJobTrigger", "QUARTZ_TEST_JOB_TRIGGER")
                .withSchedule(cronScheduleBuilder)
                .build();
        return trigger;
    }
}

четвертый шаг,существуетapplicationContext.propertiesПараметры конфигурации в файле:

sue.spring.quartz.cron=*/5 * * * * ?

Это будет выполнять метод executeInternal класса QuartzTestJob каждые 5 секунд.

Формат конфигурации CronTrigger:

[秒] [分] [小时] [日] [月] [周] [年]

spring quartzиspring taskизcronПравила выражения в основном такие же, за исключениемspring4Вышеупомянутая версия удаляет последнийquartzизCronTriggerизЭто не требуется, и я не буду вводить здесь слишком много.

использоватьspring quartzПреимущества и недостатки:

  • Преимущества: по умолчанию используется многопоточное асинхронное выполнение, когда последнее расписание не завершено, наступает время следующего планирования, один поток начинает новое планирование, и несколько задач не влияют друг на друга. Комплекс поддержкиcronВыражение, которое может быть создано кластером, поддерживающим распределенное развертывание.

  • Недостатки: по сравнению с Spring Task стоимость реализации задач по времени выше, и требуется ручная настройка.QuartzJobBean,JobDetailиTriggerЖдать. Требует введения стороннегоquartzПакет, есть определенная стоимость обучения. Параллельное планирование не поддерживается, стратегии обработки сбоев и стратегии динамического сегментирования не поддерживаются.

4. Распределенные задачи синхронизации

1.xxl-job

xxl-jobЭто распределенная платформа планирования задач, разработанная Dianping (Xu Xueli).Основными целями ее разработки являются быстрая разработка, простота обучения, легкость и простота расширения. Теперь с открытым исходным кодом и подключен к линейкам онлайн-продуктов многих компаний, из коробки.

xxl-jobпара кадровquartzбыл расширен с использованиемmysqlБаза данных хранит данные, а причал встроен какRPCсервисный звонок.

Основные особенности заключаются в следующем:

  1. Существует интерфейс для управления запланированными задачами и правилами запуска, которым очень легко управлять.

  2. Возможность динамически запускать или останавливать задачи

  3. Поддержка эластичного расширения и сжатия

  4. Оповещение о сбое задачи поддержки

  5. Поддержка динамического шардинга

  6. Отказоустойчивая поддержка

  7. Скользящий журнал в реальном времени

  8. Поддержка управления пользователями и правами

Интерфейс управления:

图片

Общая схема архитектуры выглядит следующим образом:图片

Схема кварцевой архитектуры выглядит следующим образом:

图片

Боевой проект

xxl-adminЯ не буду слишком подробно рассказывать о подготовительных работах, таких как управление фоновым развертыванием и выполнение сценария mysql.Друзья, которым это нужно, могут прийти ко мне для приватного чата.Они более склонны к эксплуатации и обслуживанию.

Если предположить, что предварительная работа выполнена, то нам необходимо:

первый шаг, представленный в файле pom.xmlxxl-jobродственные зависимости.

<dependency>
   <groupId>com.xuxueli</groupId>
   <artifactId>xxl-job-core</artifactId>
</dependency>

второй шаг,существуетapplicationContext.propertiesПараметры конфигурации в файле:

xxl.job.admin.address: http://localhost:8088/xxl-job-admin/
xxl.job.executor.appname: xxl-job-executor-sample
xxl.job.executor.port: 8888
xxl.job.executor.logpath: /data/applogs/xxl-job/

третий шаг, создать наследование класса HelloJobHandlerIJobHandlerсвоего рода:

@JobHandler(value = "helloJobHandler")
@Component
public class HelloJobHandler extends IJobHandler {

    @Override
    public ReturnT<String> execute(String param) {
        System.out.println("XXL-JOB, Hello World.");
        return SUCCESS;
    }
}

Таким образом настраивается запланированное задание.

Запланированную задачу рекомендуется развернуть отдельно на другой сервис, отдельно от сервиса API. Согласно моему прошлому опыту, в большинстве случаев задания будут выполнять пакетные операции с данными. Если объем обрабатываемых данных слишком велик, это может оказать определенное влияние на ресурсы памяти и процессора службы.

использоватьxxl-jobПреимущества и недостатки:

  • Преимущества: имеется интерфейс для управления запланированными задачами, а также поддерживаются такие функции, как эластичное расширение и сжатие, динамическое сегментирование, отработка отказа и оповещение о сбое. Его функции очень мощные, его используют многие крупные фабрики, и он может соответствовать большинству бизнес-сценариев.

  • Минусы: иquartzТочно так же через распределенную блокировку базы данных задача управления не может выполняться повторно. Есть некоторые проблемы с производительностью с очень многими задачами.

2.elastic-job

elastic-jobУстойчивая распределенная система распределенного планирования, разработанная Dangdang, богатым наличием мощным Zookeeper, достигнутым с использованием распределенной координации, добиться высокой доступности и фрагментации. Он был разработан специально для высокооднорецентных и сложных бизнес-сценариев.

elastic-jobВ настоящее времяapacheизshardingsphereПодпроект в рамках проекта, адрес официального сайта:Убейте верхнюю сферу. Apache.org/elastic job/…

elastic-jobПосле 2.x есть две линейки продуктов:Elastic-Job-LiteиElastic-Job-Cloud, и мы обычно используем Elastic-Job-Lite для удовлетворения потребностей. Elastic-Job-Lite позиционируется как легкое и децентрализованное решение, предоставляющее услуги по координации распределенных задач в виде jar-пакетов и опирающееся только на Zookeeper внешне. .

Основные особенности заключаются в следующем:

  • Координация распределенного планирования

  • Упругое расширение и сжатие

  • отказоустойчивость

  • Повторный запуск пропущенного задания

  • Согласованность сегментов заданий гарантирует, что в распределенной среде существует только один исполняемый экземпляр одного и того же сегмента.

  • Самодиагностика и устранение проблем, вызванных распределенной нестабильностью

  • Поддержка параллельного планирования

Общая схема архитектуры:

图片

Боевой проект

первый шаг, представленный в файле pom.xmlelastic-jobродственные зависимости.

<dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>elastic-job-lite-core</artifactId>
</dependency>
<dependency>
    <groupId>com.dangdang</groupId>
    <artifactId>elastic-job-lite-spring</artifactId>
</dependency>

второй шаг, добавить класс ZKConfig, настроитьzookeeper:

@Configuration
@ConditionalOnExpression("'${zk.serverList}'.length() > 0")
public class ZKConfig {

    @Bean
    public ZookeeperRegistryCenter registry(@Value("${zk.serverList}") String serverList,
                                             @Value("${zk.namespace}") String namespace) {
        return new ZookeeperRegistryCenter(new ZookeeperConfiguration(serverList, namespace));
    }

}

третий шаг, который определяет класс, реализующийSimpleJobинтерфейс:

public class TestJob implements SimpleJob {

    @Override
    public void execute(ShardingContext shardingContext){
        System.out.println("ShardingTotalCount:"+shardingContext.getShardingTotalCount());
        System.out.println("ShardingItem:"+shardingContext.getShardingItem());
    }
}

четвертый шаг, добавьте задачу настройки JobConfig:

@Configuration
public class JobConfig {
    @Value("${sue.spring.elatisc.cron}")
    private String testCron;
    @Value("${sue.spring.elatisc.itemParameters}")
    private  String shardingItemParameters;
    @Value("${sue.spring.elatisc.jobParameters}")
    private String jobParameters =;
    @Value("${sue.spring.elatisc.shardingTotalCount}")
    private int shardingTotalCount;
    
    @Autowired
    private ZookeeperRegistryCenter registryCenter;

    @Bean
    public SimpleJob testJob() {
        return new TestJob();
    }

    @Bean
    public JobScheduler simpleJobScheduler(final SimpleJob simpleJob) {
        return new SpringJobScheduler(simpleJob, registryCenter, getConfiguration(simpleJob.getClass(),
                cron, shardingTotalCount, shardingItemParameters, jobParameters));
    }

    private geConfiguration getConfiguration(Class<? extends SimpleJob> jobClass,String cron,int shardingTotalCount,String shardingItemParameters,String jobParameters) {
        JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(jobClass.getName(), testCron, shardingTotalCount).
                shardingItemParameters(shardingItemParameters).jobParameter(jobParameters).build();
        SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, jobClass.getCanonicalName());
        LiteJobConfiguration jobConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();
        return jobConfig;
    }
}

в:

  • cron: выражение cron, определяющее правила срабатывания.

  • shardingTotalCount: определяет общее количество сегментов заданий.

  • shardingItemParameters: определение параметров элемента распределения. Как правило, серийный номер сегментирования и параметры разделяются знаком равенства. Несколько пар "ключ-значение" разделяются запятыми. Серийный номер сегментирования начинается с 0 и не может быть больше или равен общему числу. осколков работы.

  • jobParameters: настраиваемые параметры задания

пятый шаг,существуетapplicationContext.propertiesПараметры конфигурации в файле:

spring.application.name=elasticjobDemo
zk.serverList=localhost:2181
zk.namespace=elasticjobDemo
sue.spring.elatisc.cron=0/5 * * * * ?
sue.spring.elatisc.itemParameters=0=A,1=B,2=C,3=D
sue.spring.elatisc.jobParameters=test
sue.spring.elatisc.shardingTotalCount=4

Таким образом, задание на время настраивается, и шаги для создания задания на время относятся кxxl-jobЭто утомительно.

использоватьelastic-jobПреимущества и недостатки:

  • Преимущества: поддержка распределенного планирования и координации, поддержка фрагментации, подходит для высокой степени параллелизма и некоторых относительно сложных бизнес-сценариев.

  • Недостатки: нужно полагаться на смотрителя зоопарка, выполнение задач на время относительноxxl-jobЧтобы немного усложнить, вам нужно хорошо знать правила шардинга.

3. Другие распределенные задачи синхронизации

1. Saturn

SATURN - это распределенная плана планирования задач, открытая Vipshop. Замена традиционного метода задания Batch Linux CRON / SPACK, он достигает унифицированной конфигурации, унифицированного мониторинга, доступность высокой задачи и кафервлению одновременной обработки.

Saturn основан на Elastic-Job с открытым исходным кодом Dangdang, в сочетании с потребностями всех сторон и нашими практическими знаниями. Варианты использования: Vipshop, Kugou Music, Xinwang Bank, Hairongyi, Hangmei Online, кредитная информация Liangfu и т. д. 

адрес гитхаба:GitHub.com/Vipshop/Сб…

2. TBSchedule

TBSchedule — это распределенная платформа планирования задач, разработанная Alibaba, цель которой — отделить задачи планирования от бизнес-систем, уменьшить или исключить связь с бизнес-системами и выполнять эффективную асинхронную обработку задач.

В настоящее время он широко используется в системе планирования процессов многих интернет-компаний, таких как Alibaba, Taobao, Alipay, JD.com, Jumei, Autohome и Gome.

адрес гитхаба:GitHub.com/Taobao/TBS C…

Честно говоря, отличное время или с большим количеством задач, что не означает, что мы Niubi регулярные задачи, которые он должен использовать, но выбирать на основе реальных потребностей бизнеса. Каждый из них имеет свои преимущества и недостатки, регулярные задачи, разумный выбор, который отвечает потребностям бизнеса, но и позволяет избежать растраты ресурсов, является лучшей политикой. Конечно, в реальных бизнес-сценариях обычно используется в сочетании с различными временными задачами.

Кстати, приветствую вас, дорогие друзья, приходите и поговорите со мной: какие задачи на время вы использовали, с какими проблемами столкнулись и как их решить. Вы можете задать мне, если у вас есть какие-либо связанные вопросы.

Надеюсь, мы сможем добиться прогресса и расти вместе.

Последнее слово (пожалуйста, обратите внимание, не проституируйте меня по пустякам)

Если эта статья оказалась для вас полезной или поучительной, отсканируйте QR-код и обратите внимание, ваша поддержка — самая большая мотивация для меня продолжать писать.

Попросите в один клик три ссылки: лайк, вперед и смотреть.

Следите за официальной учетной записью: [Су Сан сказал о технологии], ответьте в официальной учетной записи: интервью, артефакт кода, руководство по разработке, управление временем имеют большие преимущества для фанатов, и ответьте: присоединяйтесь к группе, вы можете общаться и учиться со старшими многих производители БАТ.