68eefff884f4b77722cc78e58f8a68398744f7e5
Build Media Mirror Worker / Build and publish (release) Successful in 1m25s
Проблема: returnStaleToNew (stale-timeout 30м) смотрит только taken_at, который ставится один раз при взятии джоба. Долгий джоб (скачивание 7.2 ГБ 11 мин + конвертация 24 мин > 30 мин) возвращался в очередь и перехватывался вторым воркером → дубль работы, падение на скачивании, статус failed при успешно работающем первом воркере. Решение: heartbeat — пока джоб выполняется, воркер каждые 10 сек обновляет taken_at (UPDATE ... WHERE status='processing'). Мёртвый воркер по-прежнему перехватывается через stale-timeout; живой — никогда не считается зависшим. - JobRepository.heartbeat(id): UPDATE taken_at/updated_at с guard processing - JobProcessor: параллельная корутина heartbeat (свой CoroutineScope+Dispatchers.IO), отмена в finally (done/failed/cancelled) - AppProperties.heartbeatInterval = 10s, application.yaml heartbeat-interval: 10s - JobRepositoryTest: heartbeat обновляет processing-джоб, не трогает non-processing
media-mirror-worker
Media mirror: конвертация в зеркала для очков
Description