【问题标题】:Need Guidance for Cron Job Rails需要 Cron Job Rails 的指导
【发布时间】:2026-01-04 10:50:01
【问题描述】:

我有一个 Rails 应用程序。 rails 应用程序有许多“游戏”,每个游戏都使用一个 API,我可以使用它来查看游戏是否结束。我想为每个游戏设置一个 cron 作业,每 10 分钟检查一次游戏是否结束,如果是,则停止该游戏的 cron 作业。

“rufus-scheduler”似乎是一个合法的简单宝石。我只是在寻找一些关于如何去做的指导。创建游戏时是否将其存储在我的控制器中?

  scheduler = Rufus::Scheduler.new
  scheduler.every '10m' do
    #look for game over, until game over
  end

如果用户不再激活控制器,cron 作业会继续运行吗?解决这个问题的最佳方法是什么?

【问题讨论】:

  • 为什么需要每个游戏的 cron 条目?我闻起来很腥,好像有更好的解决方案?
  • 如果你能想到一个我对它持开放态度,但该网站允许两个用户在在线视频游戏中“挑战”对方。我有一个 api 可以让我检查每场比赛是否结束。有什么更好的想法吗?
  • 你也是对的。谢谢菲利普。只是没明白你想说什么。

标签: ruby-on-rails cron


【解决方案1】:

我从未使用过rufus-scheduler,但我使用过whenever,我相信whenever 在Rails 社区中使用得更多。

无论如何,要在 rufus-scheduler 中执行此操作,我认为您只需在“每 10m”块中添加您的 rails 代码即可。假设您在 Game 上创建了一个类方法,例如:

class Game
  def self.clean_ended_games
    #logic to clean/stop/remove cron for games that have ended
  end
end

然后使用 rufus,您将在 config/initializers/scheduler.rb 中执行以下操作:

require 'rufus-scheduler'
scheduler = Rufus::Scheduler.new
scheduler.every '10m' do
  Game.clean_ended_games
end

无论何时使用都非常相似。在config/schedule.rb 文件中,您将输入:

every 10.minutes do
  runner "Game.clean_ended_games"
end

【讨论】:

  • 嗯。谢谢您的回答!任何帮助是极大的赞赏。所以你说我会运行两个 cron 作业?一种是检查游戏是否仍在进行(因为这是需要的东西,对吗?),另一种是检查所有游戏并从已结束的游戏中删除 cron 作业?
  • 不,我不太了解您正在尝试做什么以提供有关 cron 作业应该做什么或需要多少工作的帮助。我只是举了一个使用 rufus 和任何时候设置 cron 的示例。
  • 三思而后行,我认为您应该只拥有一个运行和停止/清理任何已结束游戏的 cron 作业(在任何控制器之外独立安排)。我认为您不需要多个 cron 作业。