Ruby で書かれた IronMQ のワーカーは params
メソッドでペイロードをアクセスできるようになっている:
sample1_worker.rb
puts params['key']
ワーカーを実行
iron_worker queue sample1 --payload '{"key": "value"}'
# => value
params
メソッドは IronMQ がホストする実行環境で動的に定義されるため、ローカルでワーカーを実行すると未定義エラーになる。
ワーカーをローカルでも動くようにするには、 params
メソッドを自前で動的に定義してやるとよい:
sample2_worker.rb
require 'json'
unless defined?(params)
abort "Usage: sample2_worker.rb <payload_json>" if ARGV.empty?
param_obj = JSON.parse(ARGV[0])
send :define_method, :params, -> { param_obj }
end
puts params['key']
ワーカーをローカルで実行
ruby sample2_worker.rb '{"key": "value"}'
# => value
ワーカーを実行
iron_worker queue sample2 --payload '{"key": "value"}'
# => value
ちなみに、 params
をメソッドではなく変数として定義すると、ローカルでは動くが IronMQ の環境で実行できなくなる:
sample3_worker.rb
require 'json'
unless defined?(params)
abort "Usage: sample2_worker.rb <payload_json>" if ARGV.empty?
param_obj = JSON.parse(ARGV[0])
params = param_obj
end
puts params['key']
ワーカーをローカルで実行
ruby sample3_worker.rb '{"key": "value"}'
# => value
ワーカーを実行
iron_worker queue sample3 --payload '{"key": "value"}'
# => params が nil になってエラー
これは Ruby の言語仕様による。条件分岐の中で変数を定義すると、その条件分岐を通らない場合には値が nil の変数として定義される。よって params
メソッドが定義されていれば上記の unless を通らず、値が nil の params
変数が定義されてメソッドが上書きされる。