Symfoware

Symfowareについての考察blog

RabbitMQにPythonクライアント(pika)からメッセージを送信、受信する

RabbitMQをインストール。
Javaのクライアントからメッセージの送受信を行ってみました。
RabbitMQにJavaクライアントからメッセージを送信、受信する

Pythonクライアントでも同様のことを試してみます。


pikaのインストール



こちらを参考にしました。
http://www.rabbitmq.com/tutorials/tutorial-one-python.html

「pika」というライブラリがおすすめのようなので、これを使用することにします。
GitHub pika

クライアントはUbuntu 14.04です。
easy_installでインストールしました。


$ sudo easy_install pika



0.9.14がインストールされました。






送信サンプル




送信のサンプルプログラムはこのようになりました。


  1. # -*- coding:utf-8 -*-
  2. import pika
  3. # ユーザー名とパスワード
  4. credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
  5. # 接続パラメーター作成
  6. connect_param = pika.ConnectionParameters(
  7.                     host='192.168.1.12',
  8.                     credentials=credentials)
  9. # コネクション作成
  10. connection = pika.BlockingConnection(connect_param)
  11. channel = connection.channel()
  12. channel.queue_declare(queue='hello')
  13. channel.basic_publish(exchange='',
  14.                      routing_key='hello',
  15.                      body='Hello World!')
  16. print " [x] Sent 'Hello World!'"





webインターフェースを有効にしたのが原因か、
ユーザー名、パスワードを明示しないと


pika.exceptions.ProbableAuthenticationError



というエラーになります。
デフォルト設定の場合は、credentialsの指定は不要だと思います。


実行すると、こんな結果になるはずです。


$ python sample.py
[x] Sent 'Hello World!'




管理画面上もキューが登録されていることになりました。

469_01.png



受信のサンプル



受信は、メッセージを受け取った時のコールバックメソッドを作成。
それを監視用のメソッドに登録という感じです。

無限ループしなくてよく、綺麗にかけますね。


  1. # -*- coding:utf-8 -*-
  2. import pika
  3. # ユーザー名とパスワード
  4. credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
  5. # 接続パラメーター作成
  6. connect_param = pika.ConnectionParameters(
  7.                     host='192.168.1.12',
  8.                     credentials=credentials)
  9. # コネクション作成
  10. connection = pika.BlockingConnection(connect_param)
  11. channel = connection.channel()
  12. # helloキューに接続
  13. channel.queue_declare(queue='hello')
  14. print ' [*] Waiting for messages. To exit press CTRL+C'
  15. # コールバックメソッドを指定
  16. def callback(ch, method, properties, body):
  17.     print " [x] Received %r" % (body,)
  18. # コールバックを登録して待ち受け
  19. channel.basic_consume(callback,
  20.                      queue='hello',
  21.                      no_ack=True)
  22. channel.start_consuming()





実行すると、先ほど送信したメッセージを受信。
その後、ずっとメッセージを監視してくれます。


$ python sample.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'




Ctrl + Cでプログラムを終了します。






キューの永続化



Javaの時と同様、キューを永続化させる方法を調べておきます。
RabbitMQでキューの内容を永続化する

登録は以下のようになります。


  1. import pika
  2. # ユーザー名とパスワード
  3. credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
  4. # 接続パラメーター作成
  5. connect_param = pika.ConnectionParameters(
  6.                     host='192.168.1.12',
  7.                     credentials=credentials)
  8. # コネクション作成
  9. connection = pika.BlockingConnection(connect_param)
  10. channel = connection.channel()
  11. channel.queue_declare(queue='hello',durable=True)
  12. properties = pika.BasicProperties(
  13.                 content_type='text/plain',
  14.                 delivery_mode=2)
  15. channel.basic_publish(exchange='',
  16.                      routing_key='hello',
  17.                      body='Hello World!',
  18.                      properties=properties)
  19. print " [x] Sent 'Hello World!'"




channel.queue_declareで、durable=Trueを指定。
pika.BasicPropertiesでdelivery_mode=2(永続化)を指定します。

登録すると、ツール上の表記に「D」がつくようです。

469_02.png



受信側は、durable=Trueの指定の追加でOKでした。


  1. # -*- coding:utf-8 -*-
  2. import pika
  3. # ユーザー名とパスワード
  4. credentials= pika.PlainCredentials('symfo', 'P@ssw0rd')
  5. # 接続パラメーター作成
  6. connect_param = pika.ConnectionParameters(
  7.                     host='192.168.1.12',
  8.                     credentials=credentials)
  9. # コネクション作成
  10. connection = pika.BlockingConnection(connect_param)
  11. channel = connection.channel()
  12. # helloキューに接続
  13. channel.queue_declare(queue='hello',durable=True)
  14. print ' [*] Waiting for messages. To exit press CTRL+C'
  15. # コールバックメソッドを指定
  16. def callback(ch, method, properties, body):
  17.     print " [x] Received %r" % (body,)
  18. # コールバックを登録して待ち受け
  19. channel.basic_consume(callback,
  20.                      queue='hello',
  21.                      no_ack=True)
  22. channel.start_consuming()








落ち穂拾い



一回、永続化を指定せず「hello」というキューを作成。
その後永続化指定で「hello」にデータを登録しようとするとエラーになします。

「hello」という名前のキューを削除したい場合は、管理画面の「Queues」を表示。
キューの名前をクリックします。

469_03.png


下の方までスクロールすると「Delete」ボタンがあるのでクリック。
これで「hello」キューが削除できます。

469_04.png


これでhelloキューがなくなりました。

469_05.png


なお、キューの監視体制にあったプログラムはエラーで終了します。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/09/07(日) 16:20:49|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RabbitMQにPHPクライアント(php-amqplib)からメッセージを送信、受信する | ホーム | RabbitMQでキューの内容を永続化する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1489-c7812ade
この記事にトラックバックする(FC2ブログユーザー)