Задачи синхронизации SpringBoot и асинхронные операции

Spring Boot
Задачи синхронизации SpringBoot и асинхронные операции

Задачи синхронизации SpringBoot и асинхронные операции

Ежедневная похвала, спасибо боссу.

Добро пожаловать на общедоступный номер: на самом деле это Овен. Галантерея продолжает обновляться......

1. Запланированные задачи

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

1. Технология

Существует множество техник реализации задач на время

  • Таймер: java.util.Timer, поставляемый с JDK, на самом деле больше похож на таймер, который может реализовывать отложенное выполнение и выполнение с определенной частотой или может указывать определенное время для выполнения, что используется реже.
  • ScheduledExecutorService: также предоставляется JDK. Это класс задач по времени, разработанный на основе пулов потоков. Он выполняет определенные задачи в соответствии с количеством потоков при создании исполнителей (количество нескольких потоков означает, что каждому символу назначается поток)
  • Spring Task: То есть сегодня будет представлен главный герой, который идет вместе со Spring.Конечно, здесь он используется через Springboot.
  • Quartz: платформа планирования с открытым исходным кодом с более мощными функциями.

2. Использование аннотации

1) @EnableScheduling

Откройте задание на время, которое можно отметить в классе запуска или любом классе конфигурации (можно сканировать на объекте)

2) @Запланировано

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

  • fixedRate: временной интервал между временем запуска предыдущей задачи и временем запуска следующей задачи (в миллисекундах).
  • fixedDelay: временной интервал (в миллисекундах) между временем окончания предыдущей задачи и временем начала следующей задачи.
  • InitialDelay: время (в миллисекундах) первого выполнения задержки выполнения
  • cron: настроить время выполнения с помощью выражений cron

3. cron-выражения

Сценарии временных задач: отложенное выполнение, выполнение с определенной периодичностью, выполнение в заданное время

Выражение CRON здесь состоит в том, чтобы описать правила времени для выполнения задач. Cron состоит из 6-7 элементов, разделенных пробелами, которые представляют:

  • С: от 0 до 59
  • Оценка: 0~59
  • Час: 0~23
  • День: 1~31 (последний день определенного месяца также может быть 30)
  • Месяц: 1~12
  • Неделя: 1~7 (обратите внимание, что 1 — воскресенье)
  • Год: 1970~2099

В дополнение к указанным выше цифровым элементам существует несколько специальных значений элементов:

  • *: Указывает, что любое значение будет активировано, и оно может появиться в семи позициях элементов.Если оно появляется в минуте, это означает, что оно будет возвращаться и выполняться каждую минуту.
  • ? : Аналогично *, но отображается только для дня и недели (только одна из этих двух позиций может быть осмысленным описанием, например: либо 3-е число каждого месяца, либо среда каждой недели каждого месяца), когда одна из них настроена со значимыми значениями, другой пишет?
  • -: Указывает диапазон (до), который может появиться во всех семи позициях элемента.Например, если 1-7 появляется в минуте, это означает, что он выполняется каждую минуту с 1 минуты до 7 минут.
  • /: Указывает, сколько времени требуется для выполнения с момента запуска, и он может появиться в любой из семи позиций элемента.Например, если 1/7 появляется в минуте, это означает, что он запускается один раз в минуту.1+ 7=8 минут.
  • ,: Представляет значение перечисления, которое может встречаться во всех семи позициях элементов. Например, если в минуте появляются 1 и 7, это означает, что 1 минута и 7 минут выполняются по одному разу
  • L: означает последний, он будет отображаться только в позициях дня и недели, день означает последний день, а неделя будет сопоставляться с такими числами, как 5L означает последний четверг
  • W: указывает действительный рабочий день (с понедельника по пятницу), который будет отображаться только в дате с цифрами впереди, например, 5W: если 5-е число — суббота, время выполнения — пятница, то есть 4-е число; если 5-е число Воскресенье Тогда время выполнения следующий понедельник, то есть 6-е число; (то есть система порекомендует ближайший рабочий день к сегодняшнему дню, но учтите, что перекрестный поиск выполняться не будет: если это 31W и 31-е число является Воскресенье, он будет выполнен 29 числа)
  • LW: используется вместе для обозначения последнего рабочего дня, появляется только в дате.
  • #: (добавьте цифры до и после) указывает день недели, который будет появляться только в течение недели, например, 4#2 указывает на вторую среду (спереди указан день недели, а сзади — номер )

Поняв приведенные выше правила выражений, вы сможете писать выражения cron, соответствующие условиям.Рекомендуется разработать несколько сценариев для практики.

4. Однопоточное и многопоточное выполнение

Если задача A (fixedRate=2000) и задача B (fixedRate=3000) написаны и выполняются напрямую в соответствии с приведенной выше конфигурацией, возникнут следующие проблемы:

  • Если время выполнения задачи A1 превышает 2 с, то задача A2, выполнение которой изначально планировалось через 2 с после начала задачи A1, не может быть выполнена вовремя.
  • Задача A и задача B должны быть выполнены попеременно

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

Здесь мы можем использовать аннотацию Spring @Async для достижения асинхронности.

2. Асинхронный

SpringBoot также поддерживает @Async для достижения асинхронности (добавление автоматической конфигурации можно использовать напрямую)

1. Аннотация

1) @enableasync.

Отмечены на классе загрузки или конфигурации класса, таблица открыта асинхронно

2) @асинхронный

Может быть помечен на классах (классы, которые могут быть просканированы контейнером Spring) или методах.

Аннотированные в классе методы в этом классе представлены как асинхронные.

2. Два возвращаемых значения асинхронных методов

  1. Возвращаемое значение не требуется: void

  2. Требуется возвращаемое значение:

     @Async  
        public Future<String> doTaskOne() throws Exception {
            return new AsyncResult<>("任务一完成");  
        }  
    

3. Автоматическая настройка

Используя @Async для достижения асинхронности, нижний уровень по-прежнему реализуется с использованием многопоточности, так где же устанавливается или настраивается эта многопоточность или пул потоков? Мы все добавили в SpringBoot множество автоматических настроек.Мы можем найти класс TaskExecutionAutoConfiguration в пакете задач в пакете spring-boot-autoconfigure:

@Lazy
@Bean(name = { APPLICATION_TASK_EXECUTOR_BEAN_NAME,
			AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME })
@ConditionalOnMissingBean(Executor.class)
//这个注解的意思:当在容器中没有发现Executor这个类则会加载这个bean,可以理解为此处为默认缺省对象
//返回的是一个spring为我们提供的线程池
	public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {
		return builder.build();
	}

Найдите TaskExecutorBuilder:

@Bean
	@ConditionalOnMissingBean
	public TaskExecutorBuilder taskExecutorBuilder() {
		TaskExecutionProperties.Pool pool = this.properties.getPool();
		TaskExecutorBuilder builder = new TaskExecutorBuilder();
		builder = builder.queueCapacity(pool.getQueueCapacity());
		builder = builder.corePoolSize(pool.getCoreSize());
		builder = builder.maxPoolSize(pool.getMaxSize());
		builder = builder.allowCoreThreadTimeOut(pool.isAllowCoreThreadTimeout());
		builder = builder.keepAlive(pool.getKeepAlive());
		builder = builder.threadNamePrefix(this.properties.getThreadNamePrefix());
		builder = builder.customizers(this.taskExecutorCustomizers.orderedStream()::iterator);
		builder = builder.taskDecorator(this.taskDecorator.getIfUnique());
		return builder;
	}

Свойства здесь загружаются в TaskExecutionProperties, параметры по умолчанию:

private int queueCapacity = Integer.MAX_VALUE;
private int coreSize = 8; 
private int maxSize = Integer.MAX_VALUE;
private boolean allowCoreThreadTimeout = true;

В соответствии со следующим, вы также можете настроить конфигурацию из файла yml/properties.

@ConfigurationProperties("spring.task.execution")

В дополнение к вышеуказанным методам мы также можем определить наши собственные bean-компоненты для замены bean-компонентов по умолчанию.Согласно @ConditionalOnMissingBean(Executor.class), нам нужно только добавить в класс конфигурации:

@Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(核心线程数量);
        executor.setMaxPoolSize(最大线程数量);
        executor.setQueueCapacity(任务队列大小);
        executor.initialize();
        return executor;
    }

3. Наконец

Согласно приведенному выше введению, для достижения асинхронных задач синхронизации можно расширить, добавив @Async к методу задачи для достижения

Нравится дорогая

Если вы считаете, что эта статья полезна для вас, вы можете "смотреть/переслать/лайкнуть/пометить", спасибо

Если вы найдете лучшие или отличные идеи, вы также можете обсудить их вместе в области сообщений.


Добро пожаловать на официальный аккаунт: галантерейные товары "На самом деле Овен" постоянно обновляются...