Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Перемотка

Обработчик перематывает свою файловую подписку через дескриптор перемотки: управляющая задача выполняет перемотку клиента, а то, что стояло в очереди со старой позиции, отбрасывается.

Перемотка из обработчика: команда, перемотка клиента и доставки, которые она отбрасываетОбработчикseeker.seek(position)Команда управляющей задачевне любого select!FilePosition в цель клиентаномер включительно, момент в нсПеремотка клиентавыполняется до концаПеремотана:новое поколениеОтказ: живаяподписка завершается,воспроизведение стоитДоставки старогопоколения в очередиотбрасываютсяСледующая доставкас новой позицииПолная очередь не задерживает перемотку:задача обслуживает её, пока ждёт места
Схема текстом
  1. Обработчик seeker.seek(position) → Команда управляющей задаче вне любого select!: отправляет
  2. Команда управляющей задаче вне любого select! → FilePosition в цель клиента номер включительно, момент в нс
  3. FilePosition в цель клиента номер включительно, момент в нс → Перемотка клиента выполняется до конца
  4. Перемотка клиента выполняется до конца → Перемотана: новое поколение: перемотана
  5. Перемотка клиента выполняется до конца → Отказ: живая подписка завершается, воспроизведение стоит: отказ
  6. Перемотана: новое поколение → Доставки старого поколения в очереди отбрасываются
  7. Доставки старого поколения в очереди отбрасываются → Следующая доставка с новой позиции
  8. Полная очередь не задерживает перемотку: задача обслуживает её, пока ждёт места

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

FilePosition превращается в цель клиента. Начало и конец файла переводятся напрямую. Порядковый номер включается в диапазон, поэтому перемотка на позицию, прочитанную из доставки, доставляет это сообщение снова. Момент времени в миллисекундах переводится в наносекунды, а значение вне диапазона получает отказ ещё до клиента.

Перемотка, которая сдвинула читателя, открывает новое поколение, и задача объявляет его до ответа. Подписка отбрасывает каждую доставку со старым поколением, поэтому после возврата из seek до обработчика не доходит ничего, прочитанного на старой позиции.

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

Перемотки обслуживаются и при полной очереди. Обработчик, который перестал разбирать очередь, может сам ждать перемотки, поэтому отставание больше очереди её не блокирует. После завершения работы каждая перемотка получает отказ.

Внутрипроцессный транспорт перематывает подписку так же, с теми же отказами, внутри опроса самой подписки.