RabbitMQ を Perl から利用するため、AMQP Client と管理用のコマンドラインツールを作りました

素直な書き方をしている*1ので、コードを読んでもらえれば AMQP が何か解ります。*2
cooldaemon's RabbitFoot at master - GitHub

AMQP Client の概要

RabbitFoot という名前です。内部で Net::AMQP を利用しています。
RabbitMQ 1.7.0 が対応している AMQP のクラスとメソッドにだけ対応しています。具体的には下記の通りです。

Exchange Declare, Delete
Queue Declare, Delete, Bind, Unbind
Basic Publish, Consume, Get, Ack, Recover, QoS
Tx Select, Commit, Rollback

Multi Channel に対応する事が面倒だったため、Single Channel で動作します。*3
逐次処理で同期的に利用する事を想定しているため、非同期メソッドを実行する際、引数によっては処理を一定時間ブロックします。*4
RabbitMQ 1.7.0 のコードを読むと、Bind を削除するメソッドもあるようなので、amqp0-8.xml を書き換えて実装するかもしれません。実装しました。

以下、SYNOPSIS から抜粋です。

  my $rf = RabbitFoot->new({
      timeout => 1,
  })->load_xml_spec(
      '/path/to/amqp0-8.xml',
  )->connect({
      host  => 'localhosti',
      port  => 5672,
      user  => 'guest',
      port  => 'guest',
      vhost => '/',
  });

  $rf->declare_exchange({exchange => 'test_exchange'});

上記は、Exchange を定義する例です。
他の使い方は、xt/04_use_server.t をご確認ください。

コマンドラインツールについて

rabbit_foot という名前です。引数無しで実行すると使い方が出力されます。
手抜きをするために Moose と MooseX::App::Cmd を使っているので、環境によっては重いかもしれません。*5

% /path/to/rabbit_foot
Available commands:

          commands: list the application's commands
              help: display a command's help screen

        bind_queue: bind queue to an exchange
  declare_exchange: declare exchange, create if needed
     declare_queue: declare queue, create if needed
   delete_exchange: delete a exchange
      delete_queue: delete a queue
       purge_queue: purge a queue
      unbind_queue: unbind queue to an exchange

上記の通り、Queue や Exchange を定義したり削除したりできます。
各コマンドの使い方は help で出力されます。例えば "rabbit_foot help declare_exchange" とすると declare_exchange で使える引数が表示されます。
引数の初期値は、config.json で指定する事ができるので、ホスト名やポート番号は、こちらに記述しておくと便利です。

RabbitMQ と AMQP について

概念や実際の使い方は、第四回 Erlang 分散システム勉強会 : ATND で話をさせて頂きます。

*1:私はそのつもりですが、誤りがあれば突っ込み大歓迎です

*2:言い過ぎかもしれません

*3:複数の Channel を保持する必要があるコードは、POE::Component::Client::AMQP をご利用ください。私は、必要が生じたら Erlang の世界に逃げ込みます。

*4:こちらも、POE::Component::Client::AMQP をご利用ください。私は、必要が生じたら(ry

*5:私の G5 環境では、堪え難い重さです