【问题标题】:Rails Rufus Scheduler PersistenceRails Rufus 调度程序持久性
【发布时间】:2021-04-29 18:35:29
【问题描述】:

我的 Rails 应用程序中有一个 rufus 调度程序,用于在周一至周五上午 9:30 到下午 4:00 每 5 分钟记录/插入数据。一旦用户注册,包含此操作的方法就会被触发。但是一旦用户注销,此日志记录作业就会被拦截并终止。

任何人都可以帮助弄清楚即使用户注销/会话被破坏,如何保持日志记录方法?

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

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby cron scheduler rufus-scheduler


    【解决方案1】:

    这听起来令人费解。为什么不为系统中注册的每个用户使用一个从周一到周五上午 9:30 到下午 4:00 每 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 评论道:

    我不确定在哪里调用 do_log 以充当一个包罗万象的作业,该作业将在预定时间内应用于所有“活动”用户

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

    周一至周五上午 9:30 至下午 4:00 每 5 分钟一班

    如果对你来说更容易,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)。

    此方法假定当“用户已注册”在您的系统中时,它们会被添加到数据库中以User 模型开头的用户表中。 do_log 简单地遍历所有状态为“活动”(不是“离开”、“撤销”或“其他”)的用户,并记录该特定用户的信息。

    您的问题描述含糊不清。我猜你想为每个用户记录,因为你想记录“即使用户注销/会话被破坏”的信息。

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

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

    【讨论】:

    • 嗨@jmettraux,感谢您在这里和Git 上帮助我。你的方法正是我想要的,我对 Rails 比较陌生,我不确定在哪里调用 do_log 来充当一个包罗万象的工作,在计划的时间内将应用于所有“活动”用户。再次感谢 jmettraux。
    • @hurricanenara 欢迎您,如果我的方法是您想要的,那么请接受我的回答,它给了我一点。我将通过回复您的评论问题来完成我的回答。
    • 当然可以!我很抱歉我的问题很模糊。我可以简单地说,我希望 cron 调度程序从周一至周五上午 9:30 到下午 4:00 一直以 5 分钟为增量创建记录。以前,该 cron 作业在用户注销时终止。因此,现在我在 rails config 目录(特别是 development.rb 和 production.rb)中调用 do_log 方法,它似乎适用于所有现有用户,而不依赖于任何东西。所以,再次感谢 jmettraux!
    • @hurricanenara 那么请接受我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多