【问题标题】:rufus-scheduler gem not working in railsrufus-scheduler gem 不在 Rails 中工作
【发布时间】:2013-11-26 22:20:48
【问题描述】:

我正在使用 state_machine gem 和 rufus-scheduler gem。状态机工作正常。然而,Rufus-scheduler 不是。我正在构建这个程序只是为了习惯 rufus gem。 :accepted 转换为 :both 10 秒后,它应该转换为 :only_employer。但是,由于某种原因,rufus-scheduler 无法正常工作。转换到 :both 有效,但它不会转换到 :only_employer。我该如何解决?谢谢。

class Schedule < ActiveRecord::Base
    require 'rufus-scheduler'
    scheduler = Rufus::Scheduler.new

    def set_schedule
        scheduler.in '10' do #documentation says this should be 10 seconds
          self.change_to_done
        end
    end

    state_machine :accepted, :initial => :none do
         after_transition :any => :both, :do => :set_schedule
         event :change_to_done do
             transition :both => :only_employer 
         end
    end

end

【问题讨论】:

  • 添加 scheduler.join 作为 set_schedule 方法中的最后一条语句。顺便说一句,我认为您不应该以这种方式使用 rufus-scheduler
  • 谢谢,添加了,但是没有用。我查看了文档,但不太清楚“scheduler.join”应该做什么。你介意解释一下吗?
  • 'scheduler.join' 使当前线程加入调度线程。这不是你想要的。 'scheduler.join' 用于独立脚本,而不是通过 Rails 或 Sinatra 运行的代码。

标签: ruby-on-rails ruby scheduled-tasks state-machine rufus-scheduler


【解决方案1】:

为此使用 rufus-scheduler 太过分了。

def set_schedule
  Thread.new do
    sleep 10
    self.change_to_done
  end
end

应该足够了。

但是,您在 Rails 之上运行的“服务器”是否对线程友好?如果没有,您最好将任务传递给 resque 或 sidekick 之类的东西。

【讨论】:

  • 谢谢,但就像我说的那样,这实际上只是我在将它放入更复杂的东西之前尝试做的学习 rufus 的事情。我也尝试了救援,发现它太复杂了。我也不知道如何让救援在固定的时间内完成工作。我只能弄清楚如何让它在后台重复工作,而不是在给定事件之后重复工作。
  • 阅读本文可能会帮助您获得帮助:chiark.greenend.org.uk/~sgtatham/bugs.html 您没有提供有关您的设置的详细信息(Ruby、Rails、rufus-scheduler 版本,...)。你没有告诉你在(Thin,Passenger,Unicorn,...?)之上运行 Rails,Resque-scheduler 可能会让你感兴趣。 github.com/resque/resque-scheduler
  • 我没有在任何东西上运行轨道,我花了几个小时进行救援。我正在使用 rufus 的最新版本(我在 github 上看不到它是什么版本。这是您通过将 gem 'rufus-scheduler' 放入 gem 文件中获得的任何版本。我对后台工作非常陌生所以很有可能我缺少一些基本知识,但是我已经通过了几个rails cast并在互联网上搜索了一段时间但找不到任何东西。
  • 所以您可能在 Webrick 之上运行 Rails(Rails 会在您启动它时告诉您)。这是“救援”而不是“救援”。试试上面的线程版本,看看转换是否发生,那个线程版本几乎是一个迷你 rufus-scheduler,观察发生了什么并准确报告。你最好学习如何请求帮助,否则你会继续为包括你自己在内的许多人浪费时间。
  • 太好了,谢谢。如果你愿意,我可以提出一个新问题,但我想弄清楚:“scheduler.in '10d'”是等 10 天(正好 240 小时)还是等到第 10 天的午夜还是进行其他类型的估算?
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
相关资源
最近更新 更多