Планирование — это процесс выполнения части логики приложения в определенное время в будущем. Запланированные задания — это часть бизнес-логики, которая должна выполняться по таймеру. Spring позволяет нам запускать запланированные задания в контейнере Spring с помощью некоторых простых аннотаций.
В этой статье мы покажем, как настраивать и запускать запланированные задания в приложениях Spring Boot.
Пример кода
Эта статья сопровождается примером рабочего кода на GitHub.
Создание приложения Spring Boot для планирования
Для работы некоторых примеров, давайте сначала создадим проект Spring Boot с помощью Spring boot Initializr, а затем откроем проект в нашей любимой среде IDE. Мы не добавляли никаких зависимостей в Maven, pom.xml поскольку планировщик является частью основного модуля платформы Spring.
Включение расписания
Лучше всего переместить эту аннотацию в специальный класс в пакете, который содержит код для наших запланированных заданий:
Улучшенный электро джетапак в Gravitation Suite — Minecraft 1.7.10
Планирование теперь будет активировано только тогда, когда мы загрузим класс SchedulerConfig приложение, что обеспечит лучшую модуляризацию.
Включение планирования с помощью свойства
Здесь мы указали имя свойства как scheduler.enabled . Мы хотим включить его по умолчанию. Для этого, мы также устанавливаем значение matchIfMissing в котором true означает, что мы не должны установить это свойство для того, чтобы планировать, но должны установить это свойство явно отключить планировщик.
Добавление запланированных заданий
Аннотированный метод должен удовлетворять двум условиям:
- Метод не должен иметь возвращаемого типа и поэтому должен быть возвращен void . Для методов с возвращаемым типом возвращаемое значение игнорируется при вызове через планировщик.
- Метод не должен принимать никаких входных параметров.
В следующих разделах мы рассмотрим различные варианты настройки планировщика для запуска запланированных заданий.
Выполнение задания с фиксированной задержкой
Мы используем fixedDelay атрибут, чтобы настроить выполнение задания после фиксированной задержки, он означает фиксированный интервал между концом предыдущего задания и началом нового задания.
Новое задание всегда будет ждать завершения предыдущего задания. Его следует использовать в ситуациях, когда вызовы методов должны происходить последовательно.
В этом примере мы вычисляем цену продукта, выполняя метод в компоненте Spring с фиксированной задержкой:
Здесь мы запланировали выполнение метода computePrice с фиксированной задержкой, установив значение для атрибута fixedDelay в 2000 миллисекунды или 2 секунды.
Мы также переводим метод в режим ожидания на 4 секунды, Thread.sleep() чтобы смоделировать ситуацию, когда выполнение метода занимает больше времени, чем интервал задержки. Следующее выполнение начнется только после того, как предыдущее выполнение завершится, по крайней мере, через 4 секунды, даже если интервал задержки в 2 секунды истек.
Улучшенный на-но жилет и гравитационный жилет в Gravitation Suite
Выполнение задания с фиксированной частотой
Мы используем атрибут fixedRate , чтобы указать интервал для выполнения задания через фиксированный интервал времени. Его следует использовать в ситуациях, когда вызовы методов независимы. Время выполнения метода не учитывается при решении, когда начинать следующее задание.
В этом примере мы обновляем параметры ценообразования, выполняя метод с фиксированной частотой:
Это позволит выполнять несколько запусков метода параллельно в течение перекрывающегося временного интервала.
Отсрочка первого исполнения с помощью начальной задержки
При использовании обоих fixedDelay и fixedRate первый вызов метода начинается сразу после инициализации контекста приложения. Однако мы можем отложить первое выполнение метода, указав интервал с помощью атрибута initialDelay , как показано ниже:
Здесь мы установили задержку первого выполнения метода initialDelay в 2000 миллисекунды или 2 секунды.
Указание интервалов в формате длительности ISO
До сих пор в наших примерах мы указывали временной интервал в миллисекундах. Указание более высоких значений интервала в часах или днях, что чаще всего имеет место в реальных ситуациях, трудночитаемо.
Поэтому вместо того, чтобы указывать большое значение, например, 7200000 для 2 часов, мы можем указать время в формате длительности ISO, например PT02H .
Здесь мы установили значение fixedDelayString как, PT02S чтобы указать фиксированную задержку не менее 2 секунд между последовательными вызовами. Точно так же мы можем использовать fixedRateString для указания фиксированной частоты в этом формате.
Вынесение интервала в файл свойств
Мы также можем ссылаться на значение свойства из нашего файла свойств в качестве значения атрибутов fixedDelayString или fixedRateString для экстернализации значений интервала, как показано ниже:
interval=PT02S
Здесь мы установили фиксированный интервал задержки как свойство в нашем файле application.properties . Именованное свойство interval установлено в 2 секунды в формате продолжительности PT02S .
Использование выражений Cron для определения интервала
Мы также можем указать временной интервал в cron-подобном выражении в стиле UNIX для более сложных требований планирования, как показано в этом примере:
interval-in-cron=0 * * * * *
Здесь мы указали интервал, используя выражение cron, привязанное к свойству с именем, interval-in-cron, определенным в нашем application.properties файле.
Выражение cron представляет собой строку из шести-семи полей, разделенных пробелом, для представления триггеров на секунду, минуту, час, день месяца, месяц, день недели и, необязательно, год. Однако выражение cron в Spring Scheduler состоит из шести полей, как показано ниже:
┌───────────── second (0-59) │ ┌───────────── minute (0 — 59) │ │ ┌───────────── hour (0 — 23) │ │ │ ┌───────────── day of the month (1 — 31) │ │ │ │ ┌───────────── month (1 — 12) (or JAN-DEC) │ │ │ │ │ ┌───────────── day of the week (0 — 7) │ │ │ │ │ │ (or MON-SUN — 0 or 7 is Sunday) │ │ │ │ │ │ * * * * * *
Например, выражение cron: 0 15 10 * * * запускается в 10:15 каждый день (каждую 0-ю секунду, 15-ю минуту, 10-й час, каждый день). * указывает, что выражение cron соответствует всем значениям поля. Например, * в поле минут означает каждую минуту.
Такие выражения, как 0 0 * * * *, трудно читать. Чтобы улучшить читаемость, Spring поддерживает макросы для представления часто используемых последовательностей, как в следующем примере кода:
Здесь мы указали часовой интервал с помощью макроса cron: hourly вместо менее читаемого выражения cron 0 0 * * * * .
Spring предоставляет следующие макросы:
Развертывание нескольких экземпляров планировщика с помощью ShedLock
ShedLock — это библиотека, которая гарантирует, что наши запланированные задачи при развертывании в нескольких экземплярах выполняются не более одного раза одновременно. Он использует механизм блокировки, устанавливая блокировку для одного экземпляра выполняемого задания, которая предотвращает выполнение на другом экземпляре того же задания.
Для координации ShedLock использует внешнее хранилище данных, совместно используемое несколькими экземплярами. В качестве внешнего хранилища данных может использоваться любая база данных JDBC, такая как Mongo Redis, Hazelcast, ZooKeeper или другие.
ShedLock разработан для использования в ситуациях, когда у нас есть запланированные задачи, которые не готовы к параллельному выполнению, но могут безопасно выполняться повторно. Более того, блокировки основаны на времени, и ShedLock предполагает, что часы на узлах синхронизированы.
Давайте изменим наш пример, добавив зависимости:
net.javacrumbs.shedlock shedlock-spring 4.27.0 net.javacrumbs.shedlock shedlock-provider-jdbc-template 4.27.0 com.h2database h2 runtime
Мы добавили зависимости от основного модуля shedlock-spring вместе с зависимостями от shedlock-provider-jdbc-template шаблона jdbc и от базы данных h2, которая будет использоваться в качестве общей базы данных. В производственных сценариях мы должны использовать персистентную базу данных, такую как MySQL, Postgres и т. д.
Затем мы обновляем конфигурацию нашего планировщика, чтобы интегрировать библиотеку с Spring:
Далее мы создадим таблицу, которая будет использоваться в качестве общей базы данных.
DROP TABLE IF EXISTS shedlock; CREATE TABLE shedlock( name VARCHAR(64) NOT NULL, lock_until TIMESTAMP(3) NOT NULL, locked_at TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), locked_by VARCHAR(255) NOT NULL, PRIMARY KEY (name) );
Условия использования распределенного планировщика заданий Quartz
Quartz Scheduler — это распределенный планировщик заданий с открытым исходным кодом, который предоставляет множество функций корпоративного класса, таких как поддержка JTA транзакций и кластеризации.
Среди его основных возможностей — поддержка сохранения задания для внешней базы данных, что очень полезно для возобновления невыполненных заданий, а также для целей отчетности.
Кластеризация — еще одна ключевая функция Quartz, которую можно использовать для обеспечения отказоустойчивости и/или балансировки нагрузки.
Spring Scheduler предпочтительнее, когда мы хотим реализовать простую форму планирования заданий, такую как выполнение методов для bean-компонента каждые X секунд или по расписанию cron, не беспокоясь о каких-либо побочных эффектах перезапуска заданий после сбоев.
С другой стороны, если нам нужна кластеризация вместе с поддержкой персистентности заданий, то Quartz — лучшая альтернатива.
Заключение
Краткий обзор основных моментов этой статьи:
Вы можете найти весь исходный код, использованный в статье на Github.
Источник: habr.com
Simply Jetpacks 2 — реактивные ранцы [1.17.1] [1.16.5] [1.15.2] [1.12.2] [1.10.2] [1.9.4]
Simply Jetpacks 2 — изначально был аддон для индустриального мода Ender IO и Thermal Expansion, данный аддон добавит в игру джетпаки (реактивные ранцы), при помощи них вы сможете летать по миру без читерского креатива. На данный момент мод не зависит от каких-то модов и работает сам по себе, потому это полноценный индустриальный мод на джетпаки.
Ранее на нашем сайте был мод Simply Jetpacks, но он аддон для мода Thermal Expansion и он существует на версиях игры 1.7.10 и 1.6.4.
Данный мод добавит несколько видов джетпаков с разными свойствами, расходом энергии, а так же несколько промежуточных вещей необходимых для их создания.
Так же в моде предусмотрено несколько режимов работы, можно отключить ранец, можно включить аварийную посадку, можно включить поддержание высоты. Неплохое дополнение для Ender IO или любого индустриального мода.
Скриншоты мода:
Как установить мод:
- Установи Forge
- Установи все дополнительные моды если указано.
- Скачай мод и скопируй в .minecraft/mods
- В лаунчере запускай версию игры с форджем.
Скачать мод Simply Jetpacks 2:
Выбери нужную версию игры:
1.17.1, Forge | SimplyJetpacks2-1.17.1-2.7.2.1.jar | 476.03 KB | 04-09-2021, 13:47 |
1.16.5, Forge | SimplyJetpacks2-1.16.5-2.6.11.2.jar | 486.67 KB | 19-08-2021, 16:09 |
1.16.5, Forge | SimplyJetpacks2-1.16.5-2.6.10.1.jar | 481.95 KB | 17-08-2021, 22:13 |
1.16.5, Forge | SimplyJetpacks2-1.16.5-2.6.9.1.jar | 481.96 KB | 14-08-2021, 01:16 |
1.16.5, Forge | SimplyJetpacks2-1.16.5-2.6.8.0.jar | 481.93 KB | 13-08-2021, 21:33 |
1.17.1, Forge | SimplyJetpacks2-1.17.1-2.7.1.1.jar | 476.29 KB | 08-08-2021, 00:18 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.20.0.jar | 711.50 KB | 01-05-2021, 03:36 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.19.0.jar | 712.10 KB | 24-02-2021, 02:47 |
1.16.5, Forge | SimplyJetpacks2-1.16.5-2.6.7.1.jar | 443.21 KB | 14-02-2021, 17:02 |
Forge, 1.16.4 | SimplyJetpacks2-1.16.4-2.6.6.0.jar | 443.21 KB | 18-01-2021, 14:03 |
Forge, 1.16.4 | SimplyJetpacks2-1.16.4-2.6.5.2.jar | 442.86 KB | 22-12-2020, 18:37 |
Forge, 1.15.2 | SimplyJetpacks2-1.15.2-2.5.4.1.jar | 346.10 KB | 16-12-2020, 23:49 |
1.16.1, Forge | SimplyJetpacks2-1.16.1-2.6.4.1.jar | 354.48 KB | 16-12-2020, 23:48 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.18.1.jar | 712.07 KB | 16-12-2020, 21:13 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.17.0.jar | 711.98 KB | 20-11-2020, 21:35 |
1.16.3, Forge | SimplyJetpacks2-1.16.3-2.6.3.0.jar | 354.11 KB | 18-10-2020, 21:32 |
Forge, 1.15.2 | SimplyJetpacks2-1.15.2-2.5.3.4.jar | 345.69 KB | 01-09-2020, 13:11 |
Forge, 1.15.2 | SimplyJetpacks2-1.15.2-2.5.2.2.jar | 343.16 KB | 24-08-2020, 11:29 |
1.16.1, Forge | SimplyJetpacks2-1.16.1-2.6.2.2.jar | 350.88 KB | 24-08-2020, 11:23 |
Forge, 1.15.2 | SimplyJetpacks2-1.15.2-2.5.1.1.jar | 344.41 KB | 22-08-2020, 19:56 |
1.16.1, Forge | SimplyJetpacks2-1.16.1-2.6.1.1.jar | 352.13 KB | 22-08-2020, 19:54 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.16.1.jar | 707.74 KB | 22-08-2020, 18:41 |
Forge, 1.15.2 | SimplyJetpacks2-1.15.2-2.3.0.1.jar | 358.89 KB | 13-08-2020, 21:23 |
1.16.1, Forge | SimplyJetpacks2-1.16.1-2.3.0.1.jar | 367.70 KB | 07-08-2020, 18:55 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.15.69.jar | 649.03 KB | 28-07-2020, 23:15 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.14.67.jar | 648.81 KB | 20-09-2019, 00:37 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.13.66.jar | 648.80 KB | 13-08-2019, 22:44 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.12.65.jar | 648.80 KB | 12-05-2019, 02:52 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.11.64.jar | 648.81 KB | 21-03-2019, 23:49 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.10.63.jar | 648.80 KB | 04-11-2018, 23:18 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.9.58.jar | 649.45 KB | 03-10-2018, 21:37 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.8.56.jar | 648.77 KB | 22-09-2018, 23:46 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.7.45.jar | 647.44 KB | 10-06-2018, 19:10 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.6.43.jar | 647.44 KB | 09-06-2018, 01:26 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.5.39.jar | 632.23 KB | 23-05-2018, 20:02 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.4.34.jar | 636.27 KB | 06-05-2018, 00:53 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.3.33.jar | 636.21 KB | 26-04-2018, 21:43 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.2.28.jar | 633.83 KB | 28-01-2018, 17:16 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.1.20.jar | 634.15 KB | 02-01-2018, 03:03 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.1.19.jar | 634.15 KB | 02-01-2018, 02:06 |
Forge, 1.12.2 | SimplyJetpacks2-1.12.2-2.2.0.18.jar | 634.15 KB | 31-12-2017, 01:04 |
1.10.2, Forge | SimplyJetpacks2-1.10.2-2.1.3.55.jar | 584.17 KB | 19-06-2017, 20:13 |
1.10.2, Forge | SimplyJetpacks2-1.10.2-2.1.2.53.jar | 584.13 KB | 18-06-2017, 18:40 |
1.10.2, Forge | SimplyJetpacks2-1.10.2-2.1.1.47.jar | 569.19 KB | 20-04-2017, 13:40 |
Источник: tlauncher-download.ru
Гайд по Simply Jetpacks 2!
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.
- Форум
- Основной раздел
- Гайды и руководства
- Гайды. Nightmare
Статус Закрыто для дальнейших ответов.
MishaS
Игрок
04.01.2019 35 2
Этот мод добавляет много новых ранцев и изменяет крафт старым!
Начнём мы с новых ранцев
Первый ранец у нас из проводящего железа!
Крафт:
Вмещает 80.000 RF
Потребление топлива 32 RF/тик
Второй ранец из наэлектризованной стали!
Крафт,только уже на продвинутом верстаке:
Вмещает 400.000 RF
Потребление топлива 50 RF/тик
Третий ранец из энергетического сплава!
Крафт,только уже на элитном верстаке:
Вмещает 4.000.000 RF
Потребление топлива 200 RF/тик
Ещё мод добавляет ранцы-конденсаторы!
Вид на игроке:
Все ранцы и ранцы-конденсаторы можно также бронировать и этим повысить их защиту!
И самое крутое это реактивный нагрудник из тёмного саулария!
Крафт:
Вмещает 60.000.000 RF
Потребление топлива 850 RF/тик
Внедрён зарядник!
Источник: forum.kaboom2.ru