recoverStaleJobs method

Future<int> recoverStaleJobs({
  1. Duration timeout = const Duration(minutes: 5),
})

Recovers stale jobs that were reserved but never completed (worker crashed).

Any job in 'processing' state for longer than timeout is released.

Implementation

Future<int> recoverStaleJobs({Duration timeout = const Duration(minutes: 5)}) async {
  final result = await _db.query('''
    UPDATE $_table
    SET status = 'pending', reserved_by = NULL
    WHERE status = 'processing'
      AND available_at < NOW() - INTERVAL '1 second' * @timeoutSeconds
  ''', {'timeoutSeconds': timeout.inSeconds});

  return result.affectedRows ?? 0;
}