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