AP4R on Rails はじめの一歩


概要

まじろうが大ブレイクしたAP4R。かつてプレスリリースを見たときにはいわゆるエンタープライズ向けのライブラリなんだろうなぁと思い、趣味プログラマには大袈裟そう、という印象を持ちました。しかし、RubyKaigi2007でid:kiwamuさんとid:ita-wasaさんのプレゼンテーションを見て、その思い込みがどうも間違っていたらしいことを認識しました。「メッセージングライブラリ」と聞くと難しそうですが、AP4Rを使うと非同期処理が手軽に書けるようになります。

以下に数時間弄ってみて理解した範囲でまとめておきます。debian etch上で試しました。

AP4Rインストール

まずAP4Rをインストールします。

% sudo gem install ap4r

Railsアプリケーションの用意

練習用のRailsアプリケーションtestappを作成します。

% rails install testapp

AP4Rをrailsアプリケーションに入れます。

% ap4r_setup testapp

AP4RのRails用プラグインを導入します。

% cd testapp
% ./script/plugin install svn://rubyforge.org/var/svn/ap4r/tags/ap4r-0.3.2/samples/HelloWorld/vendor/plugins/ap4r

実装

コントローラを実装します。webブラウザから呼ばれて即応するstoreアクションと、storeアクションから呼ばれて時間のかかる処理を実行するstore_asyncアクションを作ります。

% ./script/generate controller top index store
% vim app/controllers/top_controller.rb

topコントローラは以下のようにしてみました。

class TopController < ApplicationController

def index end

def store id = rand(100) ap4r.async_to({:action=>store_async}, {:id=>id}) render :text=>my id = #{id}” end

def store_async sleep 10 open(File.join(RAILS_ROOT,test.txt), a) do |f| f.puts [params[:id],Time.now.to_s].join(,) end render :text=>true end end

起動

AP4Rを起動します。

% ruby script/mongrel_ap4r start -A config/queues_disk.cfg

Railsアプリケーションを起動します。

% ruby script/server

試してみる

ブラウザで http://example.jp/top/store を開くと、RAILS_ROOTにtest.txtができます。tail -f test.txtしながら実行してみましょう。ページをリロードするとすぐに反応し、「my id = (乱数)」と表示されます。しばらくすると(sleep 10しています)、test.txtにidと時刻が追記されるはずです。

今後の課題

今後の(私の)課題としては、

などが挙げられます。

参考

6/15 18:31 の更新に関する補足(該当部分は既に修正済みです)

AP4R on Rails はじめの一歩 - kiwamu日記 によりますと、

開発時には samples/HelloWorld 以下のプラグインをさわっているので、上記の部分は変更していません。そもそも存在するのがまぎらわしいので消しておきました。 (^^;

とのことでしたので、以下の記述

ap4rのディストリビューションに付属しているプラグイン svn://rubyforge.org/var/svn/ap4r/trunk/ap4r/rails_plugin/ap4r では、RubyKaigi2007でデモしていた ap4r.async_to が使用できないようでした。

を削除しました。

また、

id:darashi さんの探し出してくれた trunk 以下のものだと開発中のため API が変わっている可能性もあります。こちらのほうが確実でしょう。

#x.y.z は AP4R のバージョンに読み替えてください。現在は、0.3.2 です。

とのコメントをいただきましたので、

% ./script/plugin install svn://rubyforge.org/var/svn/ap4r/trunk/samples/HelloWorld/vendor/plugins/ap4r

から

% ./script/plugin install svn://rubyforge.org/var/svn/ap4r/tags/ap4r-0.3.2/samples/HelloWorld/vendor/plugins/ap4r

に変更しました。