2013-05-20 34 views
1

我正在运行一堆nginx,passenger,rails,delayed_job gem,它在Ubuntu LTS上从lib/tasks /运行import.rake任务。Rails延迟作业生产不会在类/工作代码中发生变化

如果我将生产中的代码更改为import.rake。

我做了

RAILS_ENV=production script/delayed_job stop 
touch tmp/restart.txt 
ps aux | egrep '(PID|nginx)' 
sudo kill -HUP [PID] 
RAILS_ENV=production script/delayed_job start 

但是,它仍然不承认我的import.rake的变化。我不知道该怎么做。也许有什么我没有想到的?

我跑

ps -ef | grep delayed_job 

,看看是否有任何挥之不去的工作,从上面我看到的运行delayed_job的停止命令后

[server_name] 9426 6168 0 18:46 pts/0 00:00:00 grep --color=auto delayed_job 

这不应该是一个问题。我也尝试重新启动服务器,但没有帮助。

任何想法?

+0

您的延迟工作失败或根本没有运行?检查这些有问题的作业可能会有帮助,并查看它是如何被序列化的。查看delayed_jobs表中处理程序列的值。它是否直接调用import.rake中的某些东西? –

回答

1

延迟工作序列化代码的实例它入列,所以,除非你改变由你的耙的任务,而不是rake任务本身调用代码重新部署也无济于事。

要解决此问题,请将您在重新部署之间更改的代码与通过延迟作业调用的代码解耦。所以,与其MyLogic.delay.do_stuff,你可以这样做:

class DelayedTask 
    def self.do_stuff 
    self.new.delay.execute 
    end 

    private 

    def execute 
    MyLogic.do_stuff 
    end 
end 

然后,只需调用DelayedTask.do_stuff从你的代码,你可以在任何你想要的方式更改MyLogic.do_stuff(不改变方法名或PARAMS),蚂蚁它将工作。

+0

目前,我的耙子任务包含一堆通过相册并执行一些图像处理和事情的代码。您所说的是我可以将该代码移入do_stuff方法,而不是使用import.rake脚本。正确? – jim

+0

是的,rake任务只应该调用你的业务逻辑代码。如果您将任务的延迟从业务逻辑中分离出来,那么当您更改某些内容时,pending_job任务将不太可能中断。 – Spajus