[CouchApp][CouchDB] update notification のひな形と。
http://wiki.apache.org/couchdb/Regenerating_views_on_update
Wiki にあるのですが、マルチスレッドにしていたり、本質が見えにくいので、ひな形をメモ。
#!/usr/bin/env ruby # # /usr/local/share/couchdb/server/updater.rb # require 'logger' run = true logger = Logger.new("/tmp/update_notification.log") logger.info "Start CouchDB process" while run do input = gets if input == nil run = false else logger.info input end end logger.info "End CouchDB process"
要するに、stdin で待ち受けしなさいってこってす。CouchDBがkillされるときは、(まだErlangのコードみてないけど)シグナルハンドラが動いて、EOFとばしてくれるようになっているように見えます(のでgetsの結果がnilになっている)。
肝心の受け取れるメッセージなんですが、
I, [2009-06-12T02:01:20.354806 #23898] INFO -- : {"type":"updated","db":"relax-reader-development"}
はい、{"type":"updated", "db":"{dbname}"} だけです。ので何が更新されたのかはよくわかりません、ってことで。ちなみにドキュメントを作成しようが削除しようが更新しようが、"type":"updated"はかわりません。
http://www.joeandmotorboat.com/2009/06/05/sending-couchdb-update-notifications-to-rabbitmq/ にはRabbitMQ (RubyのAMQP実装?) に転送する例が書かれていますが、更新されたドキュメントを転送するのではなく、更新通知を転送する。CouchDBからupdate notificationプロセスへの通知はErlangのPortでSTDIOをpipeしている(Portの理解が正しければ)だけなので、それじゃ物足りないよ!という場合は、Message Queue にとばせばいいんだと思います。
CouchApp からこのnotificationを登録する手段を探そうと思ったのですが、とりあえず、無理そうです。例によって、/_config/update_notification にGETすれば登録されているnotificationプロセスの起動パスはわかりますし、逆にここにPUTするか、/_config/update_notification/{name} に PUTすれば、リモートからでも登録できます。
ruby -e '...'
で登録すれば、HTTPで共有できると思うので、あとでやってみる。
ruby -e "$(curl http://localhost:5984/foo/_design/app/_attachments/bar.rb)"
でもいいかも。もう何が何だか、という気分になるかもしれませんが。