Rails Rufus 调度程序持久性

Rails Rufus Scheduler Persistence

我的 Rails 应用程序中有一个 rufus 调度程序,我使用它从 9:30AM 到 4:00PM 周一至周五每 5 分钟 record/insert 数据。包含此操作的方法会在用户注册后立即触发。但是一旦用户注销,这个日志作业就会被拦截和终止。

任何人都可以帮助弄清楚如何在用户日志 out/session 被销毁时保持日志记录方法吗?

我正在我的用户控制器创建方法中调用日志记录方法,并且我已经在用户模型中设置了日志记录方法。

如有任何帮助,我们将不胜感激!

听起来很费解。你为什么不使用一个单独的计划作业,即从 9:30AM 到 4:00PM 每 5 分钟为系统中注册的每个用户使用 运行 周一到周五。

do_log =
  lambda do
    User.where(status: 'active').each do |u|
      # do the insertion for the user...
    end
  end
scheduler.cron('30,35,40,45,50,55 9 * * mon-fri America/New_York', &do_log)
scheduler.cron('*/5 10-15 * * mon-fri America/New_York', &do_log)

User.where(status: 'active') 是 Sequel,在 Rails 中可能有所不同,但我相信您可以翻译并适应您的设置和需求。

因此,只要用户在您的系统中注册,就会开始为他记录日志,即使他已经注销。

是的,我知道这不是一项工作,而是两项工作,但这满足了“0930 到 1630”的要求。

也许这不是你想要的,但你的问题不是很清楚...

更新 2021-01-30 - 1416+0900

@hurricanenara 评论道:

I'm not certain where the do_log would be called to act as an all-encompassing job that will be applied to all "active" users during the scheduled times

do_log 将被称为 '30,35,40,45,50,55 9 * * mon-fri America/New_York''*/5 10-15 * * mon-fri America/New_York',这符合您的要求:

every 5 minutes from 9:30AM to 4:00PM Mon-Fri

如果对你来说更容易,do_log可以“忘记”写

scheduler.cron('30,35,40,45,50,55 9 * * mon-fri America/New_York') do
  User.where(status: 'active').each do |u|
    # do the insertion for the user...
  end
end
scheduler.cron('*/5 10-15 * * mon-fri America/New_York') do
  User.where(status: 'active').each do |u|
    # do the insertion for the user...
  end
end

如您所见,do_log lambda 避免了重复(不要重复自己,DRY)。

此方法假定当“用户已注册”在您的系统中时,他们将被添加到数据库中的用户 table 中,前面是 User 模型。 do_log 只是遍历所有状态为“活动”(不是“离开”、“已撤销”或“随便”)的用户,并记录该特定用户的信息。

您的问题描述含糊不清。我猜你想为每个用户记录,因为你想记录信息“即使用户日志 out/session 被销毁”。

我不知道你所说的“坚持记录方法”是什么意思。我不确定你的意思是“坚持到磁盘”,所以我猜你的意思是“继续 运行ning”。

作为开发人员,您有责任清楚地说明您的问题。大多数情况下,清楚地陈述问题的努力会为您提供答案,而无需其他开发人员倾听。另见 Rubber Ducking.