dispatcher のプロトコルに dRuby が加わりました
http://rubyforge.org/pipermail/ap4r-devel-ja/2007-October/000026.html
パッチをいただきました。初パッチです♪
さっそく、id:ita-wasa さんに取り込んでもらいました。
試しに動かしてみましょう。
例によって trunk から落としてきます。
% svn co http://ap4r.rubyforge.org/svn/trunk/ap4r/ ap4r (or % svn co svn://rubyforge.org/var/svn/ap4r/trunk/ap4r ap4r) % cd ap4r % mkdir log # ap4r_setup した場合は不要だが、今は自分で作成 % mkdir public # 同上
簡単に disk モードで起動します。
% ruby -I lib script/mongrel_ap4r start -A config/queues_disk.cfg
非同期メッセージを受けとる DRb のサーバをたてておきましょう。
以下のサイトで例になっている puts00.rb を拝借します。
- 3 Hello, dRuby.
require 'drb/drb' class Puts def initialize(stream=$stdout) @stream = stream end def puts(str) @stream.puts(str) end end uri = ARGV.shift DRb.start_service(uri, Puts.new) puts DRb.uri sleep
URI を指定して起動します。
% ruby puts00.rb "druby://localhost:9999" druby://localhost:999
もうひとつ irb を起動して、通信できるか確認してみます。
% irb -rdrb >> there = DRbObject.new_with_uri('druby://localhost:9999') => #<DRb::DRbObject:0x14a7c24 @ref=nil, @uri="druby://localhost:9999"> >> there.puts "hoge" => nil
DRb サーバの画面に "hoge" と表示されていれば OK です。
% ruby puts00.rb "druby://localhost:9999" druby://localhost:9999 hoge
では、AP4R 越しに実行してみましょう。
Rails からも非同期メッセージを送信できますが、ひとまず irb 経由でさらっと。
:dispatch_mode でプロトコルを、:target_method でリモートで呼び出したいメソッドを指定しています。
% irb -rreliable-msg >> q = ReliableMsg::Queue.new "queue.test" => #<Reliablemsg::Queue:0x2637818 @queue="queue.test"> >> q.put "hoge via AP4R", {:dispatch_mode => :druby, ?> :target_method => :puts, ?> :target_url => "druby://localhost:9999", ?> :queue => "queue.test", ?> :delivery => :once} => "e5be4410-5f92-012a-d00b-0016cb9ad524"
DRb サーバの画面を確認してみると...
% ruby puts00.rb "druby://localhost:9999" druby://localhost:9999 hoge hoge via AP4R
いい感じですね♪
ちなみに Rails から呼び出すときには次のようにアクションを書きます。
def execute_via_druby Ap4r.async_to({:message => 'puts'}, "hoge_via_ap4r_from_rails", {:dispatch_mode => :druby} ) render :nothing => true end
デフォルトの宛先は druby://localhost:9999 です。任意の宛先に変更したいときは、こんな感じに指定しておきます。
Ap4r::AsyncHelper::Converters::Druby = "druby://your.druby.host:port"
その他、dispatcher の扱えるプロトコルとその指定方法はこちらにまとまっています。