How do you handle stale 'processing' jobs (i.e. jobs that were picked-up by a consumer but never finished - maybe because the consumer died)?
If an external process is responsible for marking a job as done, you could add a timestamp column that will act as a timeout. The column will be updated before the job is given to the worker.
SELECT ... WHERE ts > NOW()
UPDATE ... SET ts = NOW() + INTERVAL '1 HOUR'