【问题标题】:How to enqueue a job within a job dynamically in Rails?如何在 Rails 中动态地将工作排入工作队列?
【发布时间】:2016-06-23 20:50:25
【问题描述】:

我有一份工作,当工作运行时,在它的最底部,我想enqueue 相同的工作在 1 小时后再次运行,但参数不同。

到目前为止我所取得的成就:

class SimpleJob
  @queue = :normal

  def self.perform(start)
    puts "Right now, start = #{start}"
    start += 12
    time = some_request_external_api
    self.set(wait: time).perform_later(start)
  end
end

我正在使用resque gem,并通过QUEUE=* rake resque:work 运行该作业。当然,它在开始时会打印Right now, start = 12,但在那之后,什么也没有发生。我究竟如何才能实现这个功能?

【问题讨论】:

    标签: ruby-on-rails ruby resque rails-activejob


    【解决方案1】:

    您可以使用调度程序,例如clockwork,而不是再次将作业排入队列。

    或者,如果您尝试完成的是响应另一个服务上的某个事件,也许您可​​以查看它的文档,看看它是否提供webhook 功能。

    只要他们一方发生任何操作,它们就会向您希望的操作发送post 请求。

    【讨论】:

    • 好点,但事情是这样的:我不提前确切知道何时安排工作。我使用了一个外部 API,在该调用的响应中,我将决定何时运行下一个作业。所以基本上,我想要一个让我动态调度作业的功能,而不是使用预定义的值进行调度。
    • 如果您正在与 API 交互,并且该 API 允许您设置 webhook 操作来接收事件,无论他们发生了什么操作,无论是由于来自您的应用程序的调用还是自动,您应该理想情况下,通过 webhook 接收更新的对象。然后,您可以改为在此操作中触发您的工作。无需对其进行调度或将其排入队列。
    【解决方案2】:

    听起来您正在寻找设置定期工作的方法。如果是这样的话,看看这个:

    https://github.com/resque/resque-scheduler

    【讨论】:

    • 我看过了,但我想要的是不同的东西。我想运行一项工作,该工作最终会自行运行。您能否提供一些代码来说明我们如何通过 resque-scheduler 完成上述功能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    相关资源
    最近更新 更多