Волга
Главная
Agent Skill
API Docs
GitHub
  • English
  • Русский
Главная
Agent Skill
API Docs
GitHub
  • English
  • Русский
  • Главная
  • Старт

    • Быстрый старт
    • Обработчики
    • Параметры маршрута
    • Параметры запроса
    • Группировка маршрутов
  • Запросы и ответы

    • Заголовки (Headers)
    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Multipart-ответы
    • Сырое тело запроса
    • Cookies
    • Валидация запросов
  • Middleware и инфраструктура

    • Основы Middleware
    • Пользовательские Middleware
    • Параметризованные Middleware
    • Сжатие ответов
    • Распаковка запросов
    • CORS (Cross-Origin Resource Sharing)
    • Статические файлы
    • Rate Limiting
    • Файлы конфигурации
    • OpenAPI
  • Безопасность и доступ

    • Аутентификация и авторизация
    • OAuth 2.1 и OpenID Connect
    • OAuth 2.1 Клиент
    • Гранты «сервис-сервис»
    • DPoP — токены, привязанные к отправителю
  • Надежность и наблюдаемость

    • Центральный обработчик ошибок
    • Логгирование и Трассировка
    • Отмена запросов
    • Плавное завершение работы
  • Протоколы и realtime

    • Версии и методы HTTP
    • HTTPS
    • WebSockets
    • Server-Sent Events (SSE)
  • Продвинутые паттерны

    • Внедрение Зависимостей
    • Пользовательская обработка методов HEAD, OPTIONS и TRACE
  • Agent Skill

Отмена запросов

Если необходимо отменить длительную задачу при закрытии соединения удаленным клиентом (например, при закрытии страницы браузера), Волга поддерживает отслеживание таких сценариев, вводя CancellationToken для каждого HTTP-запроса. Который работает поверх CancellationToken среды Tokio.

Вот как это можно использовать:

use std::time::Duration;
use volga::{App, CancellationToken, ok};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // Пример длительной задачи
    app.map_get("/long-task", |cancellation_token: CancellationToken| async move {       
        // Запускаем бесконечный цикл, пока клиент не разорвет соединение
        let mut interval = tokio::time::interval(Duration::from_millis(1000));

        while !cancellation_token.is_cancelled() {
            interval.tick().await;

            // Выполняем длительную задачу...
        }

        ok!("done")
    });
    
    app.run().await
}

Более продвинутый вариант с использованием tokio::select!:

use std::time::Duration;
use volga::{App, CancellationToken, ok};

#[tokio::main]
async fn main() -> std::io::Result<()> {
    let mut app = App::new();

    // Пример длительной задачи
    app.map_get("/long-task", |cancellation_token: CancellationToken| async move {
        // Запускаем бесконечный цикл, пока клиент не разорвет соединение
        tokio::select! {
            _ = cancellation_token.cancelled() => (),
            result = long_running_task() => ()
        }
        
        ok!("done")
    });
    
    app.run().await
}

async fn long_running_task() {
    let mut interval = tokio::time::interval(Duration::from_millis(100));
    loop {
        interval.tick().await;
        
        // Выполняем длительную задачу...
    }
}

В приведенном выше примере, когда удаленный клиент отменяет запрос, сначала будет завершен cancellation_token.cancelled(), а затем tokio::select! отменит long_running_task().

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

Когда токен отменяется

Токен запроса принадлежит его соединению: он отменяется, когда соединение обрывается — клиент ушёл, — и когда у плавного завершения истекает таймаут и соединение закрывается. Только что начавшаяся остановка его не отменяет, поскольку запросы в обработке всё ещё получают ответ; обработчик, который должен сворачиваться вместе с сервером, принимает ShutdownHandle.

Обработчик уничтожается вместе со своим соединением, поэтому токен важнее всего для работы, которая переживает обработчик: запущенной им задачи или тела blocking, проверяющего is_cancelled() по ходу работы. Отмена токена из обработчика оповещает его клоны и ничего не закрывает.

Здесь вы можете найти дополнительную информацию о CancellationToken.

Последнее обновление: 19.09.2026, 06:56
Prev
Логгирование и Трассировка
Next
Плавное завершение работы