dispatcher のプロトコルに dRuby が加わりました

http://rubyforge.org/pipermail/ap4r-devel-ja/2007-October/000026.html

非同期処理を行うプロセスにdRubyでリクエストを投げられるようにするパッチです。
...

パッチをいただきました。初パッチです♪
さっそく、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 を拝借します。

http://www.druby.org/ilikeruby/d203.html

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 の扱えるプロトコルとその指定方法はこちらにまとまっています。

http://ap4r.rubyforge.org/wiki/wiki.pl?Dispatchers