Edited at

Ruby で書かれた IronMQ のワーカーをローカルでも動くようにする

More than 5 years have passed since last update.

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 変数が定義されてメソッドが上書きされる。