1

我有一个应用程序,用于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 可能有自己的钩子,在手动更新时或者如果有更好的方法可以做到这一点,这些钩子不会被调用。

4

1 回答 1

1

Oban 允许编辑预定的作业,并会做出相应的反应。

如果你看一下它的实现,它比通常的基于数据库的作业队列做得更好。它实际上实现PG_NOTIFY了在数据库级别跟踪记录更改(这是任何数据库支持的作业队列应该做的)。因此,非常感谢 oban 的作者,他在我的职业生涯中在这个主题上做了最好的工作。

此外,如果您来自 Rails / ActiveRecord,Elixir 中的等价物,名为 Ecto,不提倡使用可怕的观察者模式(使用 , 等钩子实现before_*after_*

因此,这个事实,或者来自 oban 的作者的一个好心血来潮,促使他在适当的级别实施变更跟踪。

您可以编辑这些记录。甚至在应用程序之外直接在数据库中。

也可以看看:

免责声明:我不是oban的作者,只是一个粉丝。那枚金牌属于sorentwo

于 2022-01-12T15:42:09.283 回答