2

簡単に拡張できるように、IronWorkerプロジェクトを使用することを検討しています(トラフィックが多く、バックグラウンドジョブが多い)。

DRYを維持するために、継承を使用してワーカーを定義しようとしていますが、次のエラーが発生し続けます。

/usr/local/lib/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- base_worker.rb (LoadError)
    from /usr/local/lib/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /task/child_worker.rb:3:in `<top (required)>'
    from /task/runner.rb:344:in `require_relative'
    from /task/runner.rb:344:in `<main>'

基本ワーカークラスは次のとおりです。

#  app/workers/base_worker.rb
require 'net/http'
require 'uri'
require 'json'

class BaseWorker < IronWorker::Base
  attr_accessor :params

  # The run method is what IronWorker calls to run your worker
  def run
    data = custom_run(params)
    common_post_process(data)
  end

   def custom_run(params)
     #to be overwritten in the child class 
   end    

   def common_post_process(data)
      # some common post processing => DRY
      ....
   end       
end

そして、ここに子クラスがあります:

# app/workers/child_worker.rb 
require 'net/http'
require 'uri'
require 'base_worker.rb'

class ChildWorker  <  BaseWorker
  merge "base_worker.rb"

  def custom_run(params)
     #custom work
  end

end

これを修正する方法について何かアイデアはありますか?

4

2 に答える 2

4

次世代のgem、iron_worker_ngを使用することをお勧めします:https ://github.com/iron-io/iron_worker_ruby_ng 。iron_workergemは非推奨になりました。また、現在のスタイルと同じスタイルを維持したい場合、child_worker.rbは次のようになります。

require 'net/http'
require 'uri'
require_relative 'base_worker.rb'

class ChildWorker  <  BaseWorker

  def custom_run(params)
     #custom work
  end

end

# NG gem doesn't run anything in particular, so to run your method:
cw = ChildWorker.new
cw.custom_run(params)

そしてchild_worker.workerファイルで:

runtime 'ruby'

file 'base_worker.rb'
exec 'child_worker.rb'

次に、それをIronWorkerにアップロードします。

iron_worker upload child_worker

次に、そのためのキューイングジョブを開始できます。

worker = IronWorkerNG::Client.new
worker.tasks.create("child_worker", params)
于 2012-11-09T19:58:24.307 に答える
1

を使用すると、メソッドiron_worker_ngを定義することもできますrun。このメソッドは、IronWorkerの実行時に呼び出されます。ファイル内でクラスを指定する必要があり.workerます。

# child_worker.rb
class ChildWorker
  def run
    puts "doing the hard work"
  end
end

そしてchild_worker.workerファイル:

# child_worker.worker
runtime 'ruby'
name 'ChildWorker'
exec 'child_worker.rb', 'ChildWorker'
于 2013-08-27T11:47:13.120 に答える