2016-08-22 71 views
2

我已经构建了我自己的作业服务器,它本质上是一个私有gem,作为围绕resque的包装而构建。无Rakefile运行resque

(我不是在Rails环境中运行这个)

我到处看,它似乎是一个记录/推荐的方式开始了工人,是这样的:

$ QUEUE=* rake resque:work 

哪意味着它必须在Rakefile存在的文件夹中执行。

我正在寻找一种方法来启动它没有Rakefile。

我已经学会为止:

  • 我已经通过issues看,也许有人问过类似的问题。
  • 我已经浏览了wiki,特别是FAQ
  • 我知道我可以通过分析tasks file创建我自己的“bin”来运行它,而不用耙子。
  • 我看到resque安装了一个resque二进制文件,但它似乎只提供有限的功能,例如删除和列出工作人员,但没有启动。
  • 我目前的解决方法是,我的宝石的二进制文件在运行之前(和该文件夹有一个Rakefile)在做gem的文件夹chdir,就像下面的代码一样。

def start_worker 
    ENV['QUEUE'] = '*' 
    Dir.chdir gemdir do 
    exec "rake resque:work" 
    end 
end 

def gemdir 
    File.expand_path "../../", __dir__ 
end 

欣赏在正确的方向上的任何轻推。

回答

0

目前的解决方案我已经做了这个:

def start_worker 
    interval = 5 
    queue = '*' 

    ENV['QUEUE'] = queue 
    worker = Resque::Worker.new 
    Resque.logger = Logger.new STDOUT 
    Resque.logger.level = Logger::INFO 

    ## this is not yet implemented in 1.26.0, keeping here as a reminder 
    # worker.prepare 

    worker.log "Starting worker" 
    worker.work interval 
end 

哪家的code from the rake task

作为参考的适应,我也开了github issue,在起飞的机会,别人也需要这样的功能。

0

我已经创建了一个脚本来使用下面的工人启动API创建恶魔工作进程。

def start_worker(id) 
    ENV['QUEUE'] = @queues || "*" 
    ENV['PIDFILE'] = pid_file(id) 
    ENV['JOBS_PER_FORK'] = @jobs_per_fork || "1000" 
    ENV['BACKGROUND'] = 'true' 
    ENV['TERM_CHILD'] = 'true' 
    @debug ? ENV['VVERBOSE'] = 'true' : ENV['VERBOSE'] = 'true' 

    begin 
    worker = Resque::Worker.new 
    rescue Resque::NoQueueError 
    Resque.logger.error "No queue is set for worker_id = #{id}" 
    end 

    worker.prepare 
    worker.log "Starting worker #{self}" 
    worker.work(5) # interval, will block 
end