Rufus调度程序不在环境生产中使用nginx / passenger

时间:2015-07-07 11:06:25

标签: ruby-on-rails-4 nginx passenger rufus-scheduler

我遇到rufus-scheduler无法在环境生产中工作的问题,我尝试添加: passenger_spawn_method direct; passenger_min_instances 1; rails_app_spawner_idle_time 0; 在nginx配置中,它仍然无法解决问题。

我的代码使用rufus-scheduler:

    def expired_at=(datetime)
    datetime = Time.zone.parse(datetime) if datetime.class == String && !datetime.empty?
    if expired_at
      expired_at
    else
      if datetime > Time.zone.now
        scheduler = Rufus::Scheduler.new
        begin
          scheduler.at datetime.strftime("%Y/%m/%d %H:%M") do
            self.update_attributes(:finished => true )
          end
        rescue => ex
          Rails.logger.info ex.message
          Rails.logger.info ex.backtrace
        end
      else
        self[:finished] = true
      end
      self[:expired_at] = datetime
    end
  end

我遇到了这个问题。我们将不胜感激,感谢您的帮助。

我正在使用:

  • nginx:1.8.0
  • fusion passenger:5.0.10
  • rufus-scheduler:3.1.3

1 个答案:

答案 0 :(得分:0)

我无法解决您的问题,因为您没有描述实际发生的事情(或者没有发生)。

但是,我可以告诉你,你的代码很难想到。

您的expired_at=方法,我猜它是一种模型方法。那么,您是否意识到每次调用expired_at=时都在初始化一个rufus-scheduler实例?

你最好试试

def expired_at=(datetime)

  datetime = Time.zone.parse(datetime) \
    if datetime.class == String && !datetime.empty?

  if expired_at
    expired_at
  else
    if datetime > Time.zone.now
      begin
        Rufus::Scheduler.singleton.at datetime.strftime("%Y/%m/%d %H:%M") do
          self.update_attributes(:finished => true )
        end
      rescue => ex
        Rails.logger.info ex.message
        Rails.logger.info ex.backtrace
      end
    else
      self[:finished] = true
    end
    self[:expired_at] = datetime
  end
end

它依赖于Rufus::Scheduler.singleton,因此您将使用单个rufus-scheduler实例。另一种方法是在初始化程序中启动调度程序,然后从模型中利用它。也许你会被迫做到这一点,因为Passenger可能不会保留由传入请求创建的线程。你必须仔细测试(并因此学习)。

但是,你也可以改变你的思维方式,让一个rufus-scheduler工作唤醒,每天说两次,并查询具有expired_at值的模型并设置为true如有必要。如果你这样做,你可以使用Whenever:在Rake任务中包装你的查询+更新,让Whenever(实际上你的系统的crond)每天为你调用两次(优点:你不要#39; t必须调整您的乘客设置。)

祝你好运!