recoverStaleJobs method
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;
}