2013-02-13 36 views
5

我有一个Rails应用程序,我在其中使用delayed_job。我想检测我是否处于delayed_job过程中;像检查我是否处于delayed_job过程

if in_delayed_job? 
    # do something only if it is a delayed_job process... 
else 
    # do something only if it is not a delayed_job process... 
end 

但我无法弄清楚如何。这是我使用的是什么现在:

IN_DELAYED_JOB = begin 
    basename  = File.basename $0 
    arguments  = $* 
    rake_args_regex = /\Ajobs:/ 

    (basename == 'delayed_job') || 
    (basename == 'rake' && arguments.find{ |v| v =~ rake_args_regex }) 
end 

另一种方案是,为@MrDanA说:

$ DELAYED_JOB=true script/delayed_job start 
# And in the app: 
IN_DELAYED_JOB = ENV['DELAYED_JOB'].present? 

但他们恕我直言弱解。任何人都可以提出一个更好的解

+2

这是一种方法吗?怎么样给它发送一个标志来表明这个作业是否被延迟作业调用。它可以默认为false,只有在从Delayed Job实际调用时才被设置。快速简单的解决方案,如果你找不到其他东西。 – MrDanA 2013-02-13 17:01:17

+0

是的,这是另一种解决方案(我认为你的意思是'DELAYED_JOB = true script/delayed_job start'),但我认为这也是一个弱解决方案,因为我必须记得在使用delayed_job启动应用程序时设置或取消设置变量或而不是 – mdesantis 2013-02-13 17:03:45

+0

延迟作业启动时是否自动运行此方法?我认为你正在做的是这样的:代码中的'user.delay.send_email'。然后,您可以将该行更改为“user.delay.send_email(true)”,其中“true”表示它被称为延迟作业的一部分。 – MrDanA 2013-02-13 17:14:39

回答

1

我处理这些问题的方式是通过偏执型工作者。我使用delayed_job上传到我的网站的视频转码。在视频模型中,我有一个名为video_processing的字段,默认设置为0/null。每当视频被delayed_job转码时(无论是创建还是更新视频文件),它都将使用delayed_job中的挂钩,并在作业开始时更新video_processing。一旦任务完成,完成钩将更新字段设置为0

在我看来/控制器我可以做video.video_processing? ? "Video Transcoding in Progress" : "Video Fished Transcoding"

+0

为了同样的目的,我使用delayed_job;你使用什么转码?我为'avconv'(http://libav.org/avconv.html)编写了一个Ruby包装器,无论如何,我的问题是另一个问题:我想知道我的进程是否是delayed_job进程 – mdesantis 2013-02-14 09:32:36

+0

我使用'ffmpeg'来编码视频。我使用'carrierwave','carrierwave-video','delayed_job'和'carrierwave_backgrounder'来处理上传,转码,后台处理,并将上传发送到后台处理器进行转码。 – kobaltz 2013-02-14 17:31:45

+0

我不知道'carrierwave-video'的存在,谢谢 – mdesantis 2013-02-14 23:37:49

1

也许这样的事情。一个字段添加到您的类并设置它,当你调用,可以做从延迟作业的所有工作方法:

class User < ActiveRecord::Base 
    attr_accessor :in_delayed_job 

    def queue_calculation_request 
    Delayed::Job.enqueue(CalculationRequest.new(self.id)) 
    end 

    def do_the_work 
    if (in_delayed_job) 
     puts "Im in delayed job" 
    else 
     puts "I was called directly" 
    end 
    end 

    class CalculationRequest < Struct.new(:id) 
    def perform 
     user = User.find(id) 
     user.in_delayed_job = true 
     user.do_the_work 
    end 

    def display_name 
     "Perform the needeful user Calculations" 
    end 
    end 
end 

下面是它的外观:

从延迟工作:

Worker(host:Johns-MacBook-Pro.local pid:67020)] Starting job worker 
Im in delayed job 
[Worker(host:Johns-MacBook-Pro.local pid:67020)] Perform the needeful user Calculations completed after 0.2787 
[Worker(host:Johns-MacBook-Pro.local pid:67020)] 1 jobs processed at 1.5578 j/s, 0 failed ... 

从控制台

user = User.first.do_the_work 
    User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 101]] 
I was called directly 
+0

问题是我想知道我是否处于delayed_job过程_outside_ delayed_job方法中... – mdesantis 2013-02-14 10:03:36

+0

在上面的do_the_work中,如果您从late_job以外的地方进入,in_delayed_job将为零。你可以通过延迟工作方式扩展你的意思吗? – 2013-02-14 14:29:29

+0

对不起@JohnNaegle,我之前没有看到您的评论。我错了,我想说我需要知道在作业开始前我是否处于延迟作业,即DelayedJob启动了Rails应用程序,因为我需要在Rails初始化程序中使用它。您建议的方法是正确的,但仅适用于作业开始后加载的代码。 – mdesantis 2013-11-28 13:25:19

0

如何ENV [ 'PROC_TYPE']
只说到Heroku上的...但是,当你是一个工人赛道,这是设置为“工人” 我用它作为我的“我在DJ”

+0

噢...如果你已经分叉你的网络工作者,包括一个DJ工作者(原因为什么不使用第二个网络工作者)......那么工作人员也处理DJ的,并已env设置为“工人” – baash05 2014-03-18 05:43:27

1

这个工作对我来说:

def delayed_job_worker? 
    (ENV["_"].include? "delayed_job") 
end 

Unix会将“_”环境变量设置为当前命令。

如果您有一个名为“not_a_delayed_job”的bin脚本,但不这样做,那将是错误的。

相关问题