【问题标题】:Start job from another job从另一个工作开始工作
【发布时间】:2016-10-20 10:01:27
【问题描述】:

这是我想要实现的目标: 作为用户,我可以预订课程的位置。如果课程已经满了,我会在等候名单上。当有新的位置可用时,我会收到一封电子邮件。从那时起,应用程序将启动一个后台作业,该作业将“等待”24 小时。如果我在 24 小时之前没有确认我要到场,则归于候补名单上的下一个人,他也必须在 24 小时之前确认。

问题是在将位置传递给列表中的下一个人时:由于我已经在“计时器工作”中,我需要与下一个人再次调用它。

class TimerJob
  def perform(user_id)
    send_confimation_email
    if #didn't confirm before 24h
      TimerJob.perform(next_user_on_list_id)
    else
      # save his spot
    end 
  end 
end

第一个工作正常,它发送一封电子邮件,在 24 小时内等待确认,然后向列表中的下一个人发送另一封电子邮件,但没有开始另一个工作(第 5 行)。因此,如果 24 小时等待结束,它将不会再次启动该过程。

所以问题是:我如何在我的示例中调用工作中的工作? 这不起作用有什么原因吗?

或者我是否过于复杂了,而新的眼睛会有一个更简单的解决方案?

我想从工作中调用module,这基本上会回调工作。但同样在这里,没有工作。 任何意见将不胜感激。

【问题讨论】:

  • 你在用sidekiq吗?
  • @Jayaprakash 是的,我是
  • 你能试试这个吗? “TimerJob.new.perform(next_user_on_list_id)”或“TimerJob.perform_async(next_user_on_list_id)”
  • 可以添加if #didn't confirm before 24h的代码吗?没有这个,就不可能看到 24 小时等待期的发生时间。

标签: ruby-on-rails background-process rails-activejob


【解决方案1】:

您发布的代码应该可以将工作排入队列,但是从您发布的代码中不清楚您的工作流程的“等待 24 小时”部分何时发生。看起来您的TimerJob 发送了一封电子邮件,然后立即 检查确认。

在我看来,在注册时立即发送电子邮件并使用TimerJob.perform_in(24.hours, next_user_id) 将工作排入队列会更有意义,它会检查电子邮件是否得到确认。然后,如果不是,您可以在 24 小时后发送另一封电子邮件/排队另一份工作。

【讨论】:

    猜你喜欢
    • 2013-08-16
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多