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

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

    • Заголовки (Headers)
    • Работа с JSON
    • Работа с Form Data
    • Работа с файлами
    • Cookies
  • Middleware и инфраструктура

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

    • Аутентификация и авторизация
  • Надежность и наблюдаемость

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

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

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

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

Если необходимо отменить длительную задачу при закрытии соединения удаленным клиентом (например, при закрытии страницы браузера), Волга поддерживает отслеживание таких сценариев, вводя 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 мс, не будут затронуты.

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

Последнее обновление: 18.01.2026, 18:33
Prev
Логгирование и Трассировка