ReliableMsg からメッセージ拾って何か処理する ReliableMsgAgent
ReliableMsgAgent
まだまだ改善の余地があるが書いてみました。
こんな実装
- ReliableMsg に置いてあるメッセージを自律的に取得する
- メッセージに応じて何か処理をする
- 「何か処理」は自分で定義できる
ReliableMsg とは?
ReliableMsgAgent のインストール
$ gem install reliable-msg-agent
ちょっと試すその1
ReliableMsg のキューを起動しておく
$ queues manager start I, [2011-04-10T02:56:06.061758 #32480] INFO -- : Created queues configuration file in: /usr/lib/ruby/gems/1.8/gems/reliable-msg-1.1.0/queues.cfg I, [2011-04-10T02:56:06.062504 #32480] INFO -- : Using message store: disk I, [2011-04-10T02:56:06.074105 #32480] INFO -- : Accepting requests at: druby://localhost:6438
ReliableMsgAgent プロセス起動
別窓で
$ reliable-msg-agent start *** Starting ReliableMsg-Agent... I, [2011-04-10T02:57:54.933661 #32520] INFO -- : *** reliable-msg agent service starting... I, [2011-04-10T02:57:54.934218 #32520] INFO -- : --- starting workers. I, [2011-04-10T02:57:54.938412 #32520] INFO -- : *** reliable-msg agent service started.
ReliableMsg キューにメッセージを投げてみる
更に別窓で
$ irb -rubygems -r reliable-msg irb(main):001:0> q = ReliableMsg::Queue.new "queue.agent" => #<ReliableMsg::Queue:0x2abc07e020e8 @queue="queue.agent"> irb(main):002:0> q.put "(*^o^)=3" => "36086840-4501-012e-1595-f3f4f884137e" irb(main):003:0> exit $
ReliableMsgAgent を起動したコンソールを見る
$ reliable-msg-agent start *** Starting ReliableMsg-Agent... I, [2011-04-10T02:57:54.933661 #32520] INFO -- : *** reliable-msg agent service starting... I, [2011-04-10T02:57:54.934218 #32520] INFO -- : --- starting workers. I, [2011-04-10T02:57:54.938412 #32520] INFO -- : *** reliable-msg agent service started. I, [2011-04-10T03:00:43.902741 #32520] INFO -- : message fetched - <36086840-4501-012e-1595-f3f4f884137e> I, [2011-04-10T03:00:43.903403 #32520] INFO -- : message received --- !ruby/object:ReliableMsg::Message headers: :expires: :created: 1302372043 :delivery: :best_effort :id: 36086840-4501-012e-1595-f3f4f884137e :priority: 0 :max_deliveries: 5 id: 36086840-4501-012e-1595-f3f4f884137e object: (*^o^)=3
ReliableMsg からメッセージを拾って、内容をログ出力している。
ReliableMsgAgent を終了する
INT か TERM シグナルで止まる。
Ctrl+C
I, [2011-04-10T03:10:16.513932 #32520] INFO -- : *** reliable-msg agent service stopping... I, [2011-04-10T03:10:16.514195 #32520] INFO -- : --- stopping workers. I, [2011-04-10T03:10:16.514432 #32520] INFO -- : *** reliable-msg agent service stopped. $
ちょっと試すその2
- メッセージ取得時の動作を変更してみる。
- ReliableMsgAgent の既定の動作は、メッセージを取得してログ出力するのみ。
- エージェントの #call メソッドを(再)定義するとそれを変更できる。
設定ファイルの雛形を準備する
以下、作業ディレクトリを /home/hamajyotan/reliable-msg-agent/ と仮定
gem をインストールしたディレクトリ配下の resources/ ディレクトリから必要なファイルをコピーする
$ cp $GEM_HOME/gems/reliable-msg-agent-0.1.0/resources/agent.conf /home/hamajyotan/reliable-msg-agent/ $ cp $GEM_HOME/gems/reliable-msg-agent-0.1.0/resources/agent.rb /home/hamajyotan/reliable-msg-agent/
agent.conf に設定を加える
要するに、「agent.rb はここにあるよ」という事をコンフィグに書いている。
$ echo agent: /home/hamajyotan/reliable-msg-agent/agent.rb >> agent.conf
コンフィグファイルはこんな感じになっている
$ cat agent.conf --- logger: " Proc.new { |file| l = Logger.new(file); l.level = Logger::DEBUG; l } " consumers: - source_uri: druby://localhost:6438 every: 1.0 target: queue.agent threads: 1 agent: /home/hamajyotan/reliable-msg-agent/agent.rb $
agent.rb を見てみる
agent.rb は、エージェントのクラス実装の一部を成している。
# this script is evaluated by the context of ReliableMsg::Agnet::Agent class. require "yaml" # # The method of processing the message is defined. # # if the evaluation result is nil or false, # it is considered that it failes. # # === Args # # +msg+ :: fetched message from reliable-msg queue. # +conf+ :: consumer configurations. # +options+ :: the options (it is still unused.) # def call msg, conf, options = {} @logger.info { "message received\n#{msg.to_yaml}" } end
agent.rb を書き換える
例えば、メッセージでうけた名称のディレクトリを /tmp に作成する処理
# # /home/hamajyotan/reliable-msg-agent/agent.rb # require "fileutils" def call msg, conf, options = {} dir = File.join("/tmp", msg.object) FileUtils.mkdir_p dir @logger.info { "directory created - #{dir}" } end
ReliableMsgAgent の起動
今度は、コンフィグファイルを指定しつつ実行する
$ reliable-msg-agent start -c /home/hamajyotan/reliable-msg-agent/agent.conf *** Starting ReliableMsg-Agent... I, [2011-04-10T03:39:36.582628 #32659] INFO -- : *** reliable-msg agent service starting... I, [2011-04-10T03:39:36.582793 #32659] INFO -- : --- starting workers. I, [2011-04-10T03:39:36.584784 #32659] INFO -- : *** reliable-msg agent service started.
ReliableMsg キューにメッセージを投げてみる
別窓で
$ irb -rubygems -r reliable-msg irb(main):001:0> ReliableMsg::Queue.new("queue.agent").put("foo") => "f11a65e0-4506-012e-1595-f3f4f884137e" irb(main):002:0> ReliableMsg::Queue.new("queue.agent").put("bar") => "f93693a0-4506-012e-1595-f3f4f884137e" ruby-1.8.7-p302 :003 > exit $
ReliableMsgAgent を起動したコンソールを見る
$ reliable-msg-agent start -c /home/hamajyotan/reliable-msg-agent/agent.conf *** Starting ReliableMsg-Agent... I, [2011-04-10T03:39:36.582628 #32659] INFO -- : *** reliable-msg agent service starting... I, [2011-04-10T03:39:36.582793 #32659] INFO -- : --- starting workers. I, [2011-04-10T03:39:36.584784 #32659] INFO -- : *** reliable-msg agent service started. I, [2011-04-10T03:41:45.406074 #32659] INFO -- : message fetched - <f11a65e0-4506-012e-1595-f3f4f884137e> I, [2011-04-10T03:41:45.406460 #32659] INFO -- : directory created - /tmp/foo I, [2011-04-10T03:41:58.519396 #32659] INFO -- : message fetched - <f93693a0-4506-012e-1595-f3f4f884137e> I, [2011-04-10T03:41:58.519885 #32659] INFO -- : directory created - /tmp/bar
ReliableMsg からメッセージを拾って、ディレクトリを作成している模様。