1

Mongoidとdelayed_job_mongoidのgemを使用しています。Rails(3.2.3)を含め、すべてが最新バージョンになっています。

メソッド宣言の後にhandle_asynchronouslyを置くと、このメソッドは常に非同期で実行されることを理解しています。しかし、次のような未定義のメソッドエラーが発生します。

class Item
  # mongoid include stuff

  def shout
    puts 'a simple hi'
  end
  handle_asynchronously :shout
end

item = Item.create
item.shout # returns a delayed job object

j = _
# wait a moment
j.last_error 

{undefined method `shout_without_delay' for #<Item:0x007f8365e62978>
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/mongoid-2.4.9/lib/mongoid/attributes.rb:166:in `method_missing'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/performable_method.rb:26:in `perform'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/backend/base.rb:94:in `block in invoke_job'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/lifecycle.rb:60:in `call'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/lifecycle.rb:60:in `block in initialize'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/lifecycle.rb:65:in `call'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/lifecycle.rb:65:in `execute'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/lifecycle.rb:38:in `run_callbacks'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/backend/base.rb:91:in `invoke_job'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/worker.rb:178:in `block (2 levels) in run'
/Users/nik/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:68:in `timeout'
/Users/nik/.rvm/gems/ruby-1.9.3-p194/gems/delayed_job-3.0.2/lib/delayed/worker.rb:178:in `block in run'
/Users/nik/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/benchmark.rb:295:in `realtime'

しかし、私が電話した場合

item.delay.shout

handle_asynchronously行なし

それが動作します!

何か案は?ありがとう!

4

2 に答える 2

2

これは投稿の作者です。私は何が起こったのかを知りました。簡単な答え:ターミナルでワーカーを再起動する必要があります

[control + c]
rake jobs:work

mongoid遅延ジョブがメソッドを見つけることができるようにします。何故かはわからない。したがって、handle_asynchronously:methodの別の行を追加したときはいつでも、ワーカーを再起動することを忘れないでください。

ハッピーコーディング!

于 2012-06-02T23:02:58.627 に答える
1

構文は次のようになります

class Item
   # mongoid include stuff

   def shout
      puts 'a simple hi'
   end
   handle_asynchronously :shout
end

詳細については、https://github.com/collectiveidea/delayed_jobをご覧ください。

于 2012-05-27T10:22:33.490 に答える