我有一个elixir应用程序,用于Oban在用户指定的时间安排作业。例如,用户可以指定发送某封电子邮件的日期和时间。
Oban 在最初安排作业方面表现出色,并且具有唯一性等其他功能,但我找不到更新现有作业的预定时间的明智方法(当用户想要编辑任务时间时)。
目前,想到了两种方法:
1.取消作业并再次排队
job =
Oban.Job
|> where(fragment("args->>'task_id'") == ^task_id)
|> where([j], j.state in ~w[available scheduled])
|> Repo.one()
Oban.cancel_job(TaskWorker, job.id)
job.args
|> TaskWorker.new(schedule_at: new_time)
|> Oban.insert()
2.手动更新作业
Oban.Job
|> where(fragment("args->>'task_id'") == ^task_id)
|> where([j], j.state in ~w[available scheduled])
|> Repo.one()
|> Ecto.Changeset.cast(%{scheduled_at: new_time}, [:scheduled_at])
|> Repo.update()
但我担心 Oban 可能有自己的钩子,在手动更新时或者如果有更好的方法可以做到这一点,这些钩子不会被调用。