LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-07-03

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0