предисловие
Недавно несколько читателей прислали мне личные сообщения и спросили, какие запланированные задачи использовать в своих бизнес-сценариях. Это правда, что нам нужно использовать разные запланированные задачи в разных бизнес-сценариях, но у нас все еще есть довольно много вариантов. Сегодня я подытожу для вас 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
.
Таблица сравнения функций параметров выглядит следующим образом:
Вышеуказанные параметры, если они не используются-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
Реализация задач на время имеет следующие проблемы:
-
так как
Timer
Это однопоточная задача выполнения, если одна из задач занимает много времени, это повлияет на выполнение других задач. -
если
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:
-
Во-вторых, диапазон значений: 0-59, поддержка
*
,,
,-
,/
. -
баллы, диапазон значений: 0-59, поддержка
*
,,
,-
,/
. -
время, диапазон значений: 0-23, поддержка
*
,,
,-
,/
. -
Дата, диапазон значений: 1-31, поддержка
*
,,
,-
,/
. более секунды?
, указывающее, что если указанный星期
срабатывает, настроен日期
становится недействительным. -
месяц, диапазон значений: 1-12, поддержка
*
,,
,-
,/
. -
Неделя, диапазон значений: 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
сервисный звонок.
Основные особенности заключаются в следующем:
-
Существует интерфейс для управления запланированными задачами и правилами запуска, которым очень легко управлять.
-
Возможность динамически запускать или останавливать задачи
-
Поддержка эластичного расширения и сжатия
-
Оповещение о сбое задачи поддержки
-
Поддержка динамического шардинга
-
Отказоустойчивая поддержка
-
Скользящий журнал в реальном времени
-
Поддержка управления пользователями и правами
Интерфейс управления:
Общая схема архитектуры выглядит следующим образом:
Схема кварцевой архитектуры выглядит следующим образом:
Боевой проект
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-код и обратите внимание, ваша поддержка — самая большая мотивация для меня продолжать писать.
Попросите в один клик три ссылки: лайк, вперед и смотреть.
Следите за официальной учетной записью: [Су Сан сказал о технологии], ответьте в официальной учетной записи: интервью, артефакт кода, руководство по разработке, управление временем имеют большие преимущества для фанатов, и ответьте: присоединяйтесь к группе, вы можете общаться и учиться со старшими многих производители БАТ.