2015-07-07 3 views
0

У меня возникли проблемы с Руфус-планировщик не работает в производственной среде, я попытался добавить: passenger_spawn_method direct; passenger_min_instances 1; rails_app_spawner_idle_time 0; в Nginx конфигурации, но он все равно не решить проблема.Руфус-планировщик не работает на Nginx/пассажира в производственной среде

мой код, используя Руфус-планировщик:

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
  • фьюжн пассажира: 5.0.10
  • Руфус-планировщик: 3.1.3
+0

Не могли бы вы определить, что означает «у меня проблемы»? Вы пытаетесь приготовить яйца с ним, и они остаются холодными? http://www.chiark.greenend.org.uk/~sgtatham/bugs.html – jmettraux

+0

sr я не знаю проблем, я просто думаю, что nginx-пассажир предотвращает планировщик rufus. :( –

ответ

0

Я не могу решить вашу проблему , потому что вы не описываете, что на самом деле происходит (или не происходит).

Но, я могу вам сказать, что ваш код плохо мыслит.

Ваш метод expired_at=, я думаю, что это модельный метод. Итак, вы понимаете, что вы инициализируете экземпляр rufus-scheduler каждый раз, когда вы вызываете expired_at=?

вам лучше попробовать

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, так что вы будете использовать один экземпляр Руфус-планировщика. Другой альтернативой было бы запустить планировщик в инициализаторе, а затем использовать его из вашей модели. Возможно, вы будете вынуждены сделать это только потому, что Passenger, вероятно, не будет поддерживать поток, созданный входящим запросом. Вы должны тщательно протестировать (и, следовательно, учиться).

Но, вы можете также изменить свой образ мышления и есть одно задания Руфуса-планировщика, который будит, скажем, два раза в день, и запросы для моделей с значением expired_at и набором готового к истине, если это необходимо. Если вы пойдете таким путем, вы можете использовать Whenever: оберните свой запрос + обновление в задачу Rake и пусть каждый раз (на самом деле ваш crond вашей системы) вызывают его дважды в день для вас (преимущество: вам не нужно настраивать настройки вашего пассажира).

Удачи вам!