概要
ジョブ内で raise した際の挙動を確認してみました
環境
- macOS 11.7.10
- Python 3.11.6
- rq 1.16.1
サンプルコード
エンキューする側のコードは以下です
from datetime import timedelta
from redis import Redis
from rq import Queue
from rq_scheduler import Scheduler
from lib.util import Message
queue = Queue("default", connection=Redis(host="192.168.1.2"))
scheduler = Scheduler(queue=queue, connection=queue.connection)
scheduler.enqueue_in(timedelta(seconds=5), Message().say, msg="hello")
ジョブは単純に raise するようにしています
import time
class Message:
def say(self, **kwargs):
print("Start say")
print(kwargs)
time.sleep(10)
raise ValueError()
# print("End say")
起動
- pipenv run rq worker
- pipenv run rqscheduler
-
pipenv run app.py
動作確認
failed のジョブを確認
redis 内のキーの情報を確認すると failed したジョブの情報が格納されています
1) "rq:job:2c380d9c-c65b-41b8-8d92-3b85135782c0"
2) "rq:results:2c380d9c-c65b-41b8-8d92-3b85135782c0"
3) "rq:failed:default"
4) "rq:scheduler_instance:e276ed31a4434691b91c426e979a9e4d"
5) "rq:worker:86f028648da249c38de683f8ce10f865"
6) "rq:queues"
失敗したジョブは zset としてジョブIDが格納されています
127.0.0.1:6379> zrange rq:failed:default 0 -1
1) "2c380d9c-c65b-41b8-8d92-3b85135782c0"
結果には何も格納されていませんでした
ワーカーは自動でリトライすることはなさそう
オプションを付与していない限りリトライはしないようです
なおワーカー、スケジューラを再起動しても特にリトライはしませんでした
失敗したジョブの情報を確認するスクリプト
FailedJobRegistry として管理されています
以下のスクリプトを実行すると失敗したジョブの情報を一覧で表示してくれます
from redis import Redis
from rq import Queue
from rq.job import Job
from rq.registry import FailedJobRegistry
redis = Redis()
queue = Queue(connection=redis)
registry = FailedJobRegistry(queue=queue)
# Show all failed job IDs and the exceptions they caused during runtime
for job_id in registry.get_job_ids():
job = Job.fetch(job_id, connection=redis)
print(job_id, job.exc_info)
最後に
rq では基本はリトライせず失敗したジョブは別途管理されるようです
0 件のコメント:
コメントを投稿