2023年8月7日月曜日

rqscheduler で登録したジョブの cron 情報を変更する方法

rqscheduler で登録したジョブの cron 情報を変更する方法

概要

ジョブの meta 情報を書き換えます
ジョブの操作は Flask-RQ2 を使っています

環境

  • Python 3.11.3
  • flask-rq2 18.3
  • rq-scheduler 0.13.1

サンプルコード

from flask import Flask, request
from flask_rq2 import RQ
from rq.job import Job

app = Flask(__name__)
app.config["RQ_REDIS_URL"] = "redis://localhost:6379/0"

rq = RQ(app)


def hello():
    return "hello"


@app.route("/update")
def update_job():
    job_id = request.args["job_id"]
    cron_string = request.args.get("cron_string", "*/2 * * * *")
    scheduler = rq.get_scheduler(queue="bar")
    job = Job.fetch(job_id, connection=scheduler.connection)
    job.meta["cron_string"] = cron_string
    job.save_meta()
    return {"id": job.id, "cron_string": job.meta.get("cron_string")}


@app.route("/")
def get_jobs():
    scheduler = rq.get_scheduler(queue="bar")
    jobs = scheduler.get_jobs()
    return [{"id": job.id, "cron_string": job.meta.get("cron_string")} for job in jobs]


@app.route("/register")
def register_job():
    scheduler = rq.get_scheduler(queue="bar")
    job = scheduler.cron(
        "*/1 * * * *",
        func=hello,
        args=[],
    )
    return job.get_id()

update でジョブのメタ情報を更新しています
Job.fetch で job_id を指定して取得しその後 job.meta を更新することで cron 情報を変更することができます

動作確認

  • pipenv run rq worker bar
  • pipenv run rqscheduler
  • pipenv run flask run flask

で各種プロセスを起動しておきます

  • curl localhost:5000/register

で一度ジョブを登録し

  • curl "localhost:5000/update?job_id=b6498c8c-f78b-4be6-a3e4-857c663f9d18&cron_string=%2A%2F3+%2A+%2A+%2A+%2A"

で cron 情報を書き換えます
そしてワーカーのログで更新した時間間隔で実行されていることを確認しましょう

念のため redis 側の情報も書き換わっているか確認しましょう
meta のフィールドが cron 情報になります

127.0.0.1:6379> hgetall rq:job:b6498c8c-f78b-4be6-a3e4-857c663f9d18
 1) "meta"
 2) "\x80\x05\x957\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x0bcron_string\x94\x8c\x0b*/3 * * * *\x94\x8c\x12use_local_timezone\x94\x89u."
 3) "timeout"
 4) "180"
 5) "result_ttl"
 6) "-1"
 7) "created_at"
 8) "2023-08-03T06:20:34.186347Z"
 9) "started_at"
10) "2023-08-03T06:54:52.683199Z"
11) "status"
12) "finished"
13) "stopped_callback_name"
14) ""
15) "failure_callback_name"
16) ""
17) "success_callback_name"
18) ""
19) "ended_at"
20) "2023-08-03T06:54:52.801018Z"
21) "data"
22) "x\x9ck`\x9d*\xca\x00\x01\x1a=\x9c\x89\x05\x05z\x19\xa999\xf9S\xfcb\xa7\xd4N)\x99\xa2\a\x00y^\t\x8a"
23) "enqueued_at"
24) "2023-08-03T06:54:52.671411Z"
25) "last_heartbeat"
26) "2023-08-03T06:54:52.801019Z"
27) "description"
28) "app.hello()"
29) "worker_name"
30) "e3bb9dd7b1f544ba9042ea2b1675cc50"
31) "origin"
32) "bar"

最後に

一度登録したジョブでもメタ情報を更新することで実行時間を変更することができました

参考サイト

0 件のコメント:

コメントを投稿