我遇到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
我遇到了这个问题。我们将不胜感激,感谢您的帮助。
我正在使用:
答案 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必须调整您的乘客设置。)
祝你好运!