在没有Rakefile的情况下运行resque

时间:2016-08-22 15:47:44

标签: ruby resque

我已经构建了自己的作业服务器,它本质上是一个私有宝石,构建为resque的包装器。

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

我看到的任何地方,似乎是记录/推荐的启动工人的方式,是这样的:

$ QUEUE=* rake resque:work

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

我正在寻找一种在没有Rakefile的情况下启动它的方法。

到目前为止我学到了什么:

  • 我查看了issues,也许有人问过类似的问题。
  • 我查看了wiki,特别是FAQ
  • 通过分析tasks file,我知道我可以创建自己的“bin”来运行它而不用rake。
  • 我看到resque安装了一个resque二进制文件,但它似乎只提供了有限的功能,比如删除和列出一个worker,但是没有启动。
  • 我目前的解决方法是我的gem的二进制文件在运行之前对gem的文件夹进行chdir(并且此文件夹有一个Rakefile),如下面的代码所示。
def start_worker
  ENV['QUEUE'] = '*'
  Dir.chdir gemdir do
    exec "rake resque:work"
  end
end

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

欣赏正确方向的任何推动。

2 个答案:

答案 0 :(得分: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,但其他人也需要这样的功能。

答案 1 :(得分: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