Закройте неиспользуемые соединения. На сервере есть много клиентских соединений, которые необходимо закрыть после простоя в течение определенного периода времени.
Очистите просроченный бизнес данных. Например, объект в кеше необходимо удалить из кеша по истечении времени простоя.
Обработка тайм-аута задачи. В случае взаимодействия запрос-ответ со скользящим окном сетевого протокола обрабатывать запросы, которые не отвечают на тайм-аут.
Если заказ не оплачен в течение 30 минут после оформления заказа, заказ будет автоматически аннулирован.
Уведомление о заказе: отправьте текстовое сообщение пользователю через 60 секунд после успешного размещения заказа.
Когда заказ не оплачен, как вовремя закрыть заказ и вернуть товар?
Как регулярно проверять, был ли успешно возвращен заказ в статусе возврата?
При создании нового магазина товар не загружался в течение N дней, откуда система узнает информацию и отправляет активационное смс?
Планирование запланированных задач: используйте DelayQueue, чтобы сохранить задачи и время выполнения, которые будут выполняться в этот день, и начать выполнение, как только задача будет получена из DelayQueue.
2 Метод отложенного выполнения задач
Периодический опрос (база данных и т.д.)
DelayQueue
Timer
ScheduledExecutorService
Колесо времени (кафка)
RabbitMQ
Quartz
Redis Zset
Koala
JCronTab
SchedulerX (Али)
Лайки задерживают очередь
2.1 Опрос
Особенности: Регулярная ротация базы данных и установка статуса.
Если это не первая нода команды, будить вообще не нужно!
Предполагая, что время задержки еще не наступило, когда значение взято, нужно подождать, а в это время в очередь добавляется новое с меньшей задержкой и ставится в начало очереди, тогда
В этот момент запускается цикл for и получается вновь добавленный элемент, значит, предыдущее ожидание напрасно, и очевидно, что можно выйти из ожидания раньше!
Кроме того, если здесь ожидает много потоков, если время истекло, многие потоки заполнят очередь ожидания в пуле блокировки, чтобы конкурировать за ресурсы блокировки, но результатом может быть только успех,
Больше пишем о бесстрашной конкуренции! (множественные ожидания и пробуждения)
2.3 Таймер и TimerTask
Сортировка в TaskQueue заключается в выполнении сортировки кучи в следующее время выполнения в TimerTask, каждый раз выбирая первое в массиве.
И delayQueue сортирует результаты getDelay() элементов в очереди.
Таймер — это инструмент таймера, используемый для планирования выполнения определенных задач в фоновом потоке. Можно запланировать однократное или многократное выполнение задачи.
Основной метод:
2.4 Колесо времени (кафка)
Объяснение существительного колеса времени:
Time Grid: кольцевые блоки для хранения задержки задач;
Указатель (CurrentTime): указывает на временную сетку текущей операции, представляющую текущее время.
Количество сеток (ticksPerWheel): количество сеток времени в колесе времени.
interval (tickDuration): интервал между каждой временной сеткой
Total interval (интервал): общий интервал текущего колеса времени, равный ticksPerWheel*tickDuration
В соответствии со временем истечения каждого TimerTaskEntry и временем текущего тайм-раунда выберите подходящее ведро (фактически TimerTaskList), поместите в него объект TimerTaskEntry и, если время истечения ведра обновилось, подтолкните ведро к DelayQueue и перезапустите его.
Пример: предположим, что временная сетка или сегмент с номером 0 сохраняет время истечения t, а продолжительность каждого тика (tickDuration) составляет 20 мс. В этой сетке можно сохранить только время истечения [t~t+20]. задача мс, предполагая, что в колесе времени имеется n временных сеток, каждый интервал равен 1 мс, а время истечения равно m(мс), тогда формула расчета m%n = временная сетка или ведро, в котором оно находится, например, n=10, m=34ms, тогда его ведро или временная сетка равны 4
2.5 Отложенная задача RabbitMQ
Сам RabbitMQ напрямую не поддерживает функцию очереди с задержкой, но функцию очереди с задержкой можно смоделировать с помощью следующих функций.
RabbitMQ может установить x-message-tt для Queue и Message, чтобы контролировать время жизни сообщения.Если время ожидания истекло, сообщение становится мертвой буквой.
У RabbitMQ есть два способа установить время истечения срока действия сообщений в очереди.
О: При настройке свойств очереди все сообщения в очереди имеют одинаковый срок действия.
B: Установите сообщение отдельно, TTL каждого сообщения может быть разным.
2.6 Quartz
Почему бы не использовать Таймер?
Таймеры не имеют механизма сохранения.
Таймеры не являются гибкими (можно установить только время начала и интервал повторения, не зависящие от времени, даты, дня и т. д. (секунды, минуты, часы))
Таймеры не могут использовать пул потоков, один таймер — один поток
У таймеров нет реального плана управления
Основные понятия: планировщики, задачи и триггеры.
Отношения между тремя: планировщик отвечает за планирование каждой задачи.В определенное время или по истечении определенного времени срабатывает триггер, и начинается выполнение определенной задачи.
Планировщик — это контейнер планировщика (штаб-квартира), который может содержать множество JobDetail и триггеров, при запуске контейнера каждый JobDetail в нем будет автоматически выполняться пошагово в соответствии с триггером.
JobDetail — это исполняемое задание, которое само по себе имеет состояние.
Триггер показывает, когда нужно настроиться.
После регистрации JobDetail и Trigger в контейнере планировщика формируется сборное задание (пара, состоящая из JobDetail и Trigger), которое может быть запланировано и выполнено при запуске контейнера.
Планировщик — это контейнер, в котором есть пул потоков, который используется для планирования и параллельного выполнения каждого задания, что может повысить эффективность контейнера.
продолжение следует. . .
Если у вас есть какие-либо вопросы по вышеуказанным вопросам, вы можете обратить внимание на паблик-аккаунт, прийти и обсудить со мной, и вы можете бесплатно получить большое количество новейших учебных материалов и видео по java, а также последние материалы интервью .
Если вы считаете, что эта статья полезна для вас, или если у вас есть какие-либо вопросы и вы хотите предоставить бесплатный VIP-сервис 1 на 1, вы можете подписаться на мою официальную учетную запись, подписаться на меня, чтобы бесплатно получать большое количество последних учебных материалов и видео по Java, а также последние материалы интервью, ваши подписки и переадресация - самая большая поддержка для меня, O(∩_∩)O: