ReliableMsg からメッセージ拾って何か処理する ReliableMsgAgent

ReliableMsgAgent

まだまだ改善の余地があるが書いてみました。

こんな実装
  • 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 からメッセージを拾って、ディレクトリを作成している模様。

本当にディレクトリ作られたの?

確認

$ ls -l /tmp/{foo,bar}
/tmp/bar:
合計 0

/tmp/foo:
合計 0
$

たしかに作られている。

今後の課題

  • コンフィグ要素である target の書き方を ap4r に合わせたい
    • target にワイルドカードを使いたい
    • target に複数のキューを並べたい
    • その場合、 target でなく targets であるべきか