backgroudrbを使ってみる

  • WebDBPressのvol40のRuby on Rails本格活用を参考にサンプル的に実行してみる
  • サンプルコードを書いてみて、テストを実行してみる
  • 例外が出てアチャー

1) Error:
test_all_clawl(MyFeedTest):
NoMethodError: undefined method `[]' for #
(druby://localhost:22222) /xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/vendor/plugins/backgroundrb/backgroundrb.rb:50:in `new_worker'
(druby://localhost:22222) /xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/vendor/plugins/backgroundrb/backgroundrb.rb:49:in `synchronize'
(druby://localhost:22222) /xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/vendor/plugins/backgroundrb/backgroundrb.rb:49:in `new_worker'
/xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/app/models/my_feed.rb:26:in `crawl'
/xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/app/models/my_feed.rb:35:in `all_crawl'
/xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/app/models/my_feed.rb:34:in `each'
/xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/app/models/my_feed.rb:34:in `all_crawl'
./my_feed_test.rb:108:in `test_all_clawl'
/xxxxxxxxxxxxxxxxxxxxxxxxx/trunk/vendor/rails/activerecord/lib/../../activesupport/lib/active_support/testing/default.rb:7:in `run'

I believe that if you are passing any model objects as args to your
worker, you need this line somewhere in you model's class definition:

include DRbUndumped

hth,

なるほど。workerにモデルを受け渡すときは、モデルに特別な指定が必要とのこと。
呼び出し部分。feed_providerというモデルのオブジェクトを受け渡している。

 27     MiddleMan.new_worker (:class => :feed_crawler_worker,:args =>
 28                           {:id => self.id,:feed_provider => @feed_provider})

クラス定義で、DRbUndumpedをincludeする。

  5 module FeedProvider
  6
  7   class Base
  8   include DRbUndumped

これで実行することで、上記のエラーは解消された。