2012年8月19日日曜日

apache qpid アドレスの指定

apache qpid 概要と初期設定
apache qpid 基本的なメッセージ操作

の続き。

参考にしているのは「Programming in Apache Qpid


アドレスとは

メッセージの配送・受信を行う場合には「ブローカー」と「アドレス」を指定する必要がある。

先のサンプルでは
$ ./spout hello-world
$ ./drain hello-world

としていしている。ここで指定している「hello-world」が「アドレス」になる。
ブローカーは省略している(自動出来にlocalhostになるため)

アドレスとはqpidが受け取ったメッセージをどのexchange/queueに渡すかの判断をするためのものになる。

アドレスは以下の様な構造を指定できる。
address_string ::= <address> [ / <subject> ] [ ; <options> ]
options ::= { <key> : <value>, ... }

詳細な解説は「Address String Grammar


サブジェクトの指定

アドレスには「サブジェクト」という文字列を指定できる。クライアントはサブジェクトを基準に受け取るデータを判断できる。

$ qpid-config add exchange topic news-service
$ qpid-config
Total Exchanges: 10
          topic: 5
        headers: 1
         fanout: 1
         direct: 3

   Total Queues: 1
        durable: 0
    non-durable: 1

$ qpid-config exchanges
Type      Exchange Name       Attributes
==================================================
direct                       
direct    amq.direct          --durable
fanout    amq.fanout          --durable
headers   amq.match           --durable
topic     amq.topic           --durable
topic     hello-world        
topic     news-service       
direct    qmf.default.direct 
topic     qmf.default.topic  
topic     qpid.management

ターミナルで以下を実行してメッセージの待受を行う。
terminal1$ ./drain -t 120 news-service/sports

別のターミナルから以下を実行する。
terminal2$ ./spout news-service/sports
Message(properties={'qpid.subject': 'sports', 'spout-id': 'db78f7ff-4b51-4b3e-a3a0-818b45455a22:0'})

terminal2$ ./spout news-service/news
Message(properties={'qpid.subject': 'news', 'spout-id': 'a52e3b5b-c4bf-40a8-8304-35443c2ca6c9:0'})

最初のターミナルでは以下の「sports」サブジェクトを指定したメッセージだけを受信している。
terminal1$
Message(subject=u'sports', properties={u'qpid.subject': u'sports', 'x-amqp-0-10.routing-key': u'sports', u'spout-id': u'db78f7ff-4b51-4b3e-a3a0-818b45455a22:0'})


サブジェクトへの複数キーワード指定

サブジェクトには「.」(ピリオド)をデリミタとして複数のキーワードをセットでき、この複数キーワードに対してワイルドカードが指定できる。

* 一つのキーワードにマッチ
# 一つ以上のキーワードにマッチ


まずは「*」の例
terminal1$ ./drain -t 120 news-service/*.news

terminal2$ ./spout news-service/usa.news
Message(properties={'qpid.subject': 'usa.news', 'spout-id': 'd92cc0f3-2c94-478c-bc53-1fd7b19cef01:0'})

terminal2$ ./spout news-service/usa.sports
Message(properties={'qpid.subject': 'usa.sports', 'spout-id': '6fc84030-7484-434d-8d8e-858b7f83b1d0:0'})

terminal2$ ./spout news-service/europe.sports
Message(properties={'qpid.subject': 'europe.sports', 'spout-id': '5a76977a-073d-447d-a0e2-3808e5dc0e9d:0'})

terminal2$ ./spout news-service/europe.news
Message(properties={'qpid.subject': 'europe.news', 'spout-id': '156b3b6b-4d57-4372-bded-a10e0d148dd5:0'})

terminal1$
Message(subject=u'usa.news', properties={u'qpid.subject': u'usa.news', 'x-amqp-0-10.routing-key': u'usa.news', u'spout-id': u'd92cc0f3-2c94-478c-bc53-1fd7b19cef01:0'})
Message(subject=u'europe.news', properties={u'qpid.subject': u'europe.news', 'x-amqp-0-10.routing-key': u'europe.news', u'spout-id': u'156b3b6b-4d57-4372-bded-a10e0d148dd5:0'})

こういう指定ではマッチしない。
terminal2$ ./spout news-service/europe.news.trend
Message(properties={'qpid.subject': 'europe.news.trend', 'spout-id': '017a4e2c-6369-4e46-81b5-db996378c9c8:0'})
terminal2$ ./spout news-service/italy.europe.news
Message(properties={'qpid.subject': 'italy.europe.news', 'spout-id': '230453be-bd0b-484c-92f5-6f0c550b9b9e:0'})


次に「#」の例
terminal1$ ./drain -t 300 news-service/#.news

terminal2$ ./spout news-service/news
Message(properties={'qpid.subject': 'news', 'spout-id': '25c72965-1dc5-4b04-880a-beed137c0b16:0'})

terminal2$ ./spout news-service/sports
Message(properties={'qpid.subject': 'sports', 'spout-id': 'ea6a64fe-5fc7-49d4-a246-a784dbf5275c:0'})

terminal2$ ./spout news-service/usa.news
Message(properties={'qpid.subject': 'usa.news', 'spout-id': 'ae4555b3-f56b-49f0-a8cc-dfb9b7f18677:0'})

terminal2$ ./spout news-service/usa.sports
Message(properties={'qpid.subject': 'usa.sports', 'spout-id': 'fa371569-0cd6-466a-b470-8ab7b30a29e1:0'})

terminal2$ ./spout news-service/usa.faux.news
Message(properties={'qpid.subject': 'usa.faux.news', 'spout-id': 'e397bf79-b7ec-4c4e-94e3-e0a7c1044f80:0'})

terminal2$ ./spout news-service/usa.faux.sports
Message(properties={'qpid.subject': 'usa.faux.sports', 'spout-id': 'be23ce4d-3e60-4016-9d34-6d29aff975cd:0'})

terminal1$
Message(subject=u'news', properties={u'qpid.subject': u'news', 'x-amqp-0-10.routing-key': u'news', u'spout-id': u'25c72965-1dc5-4b04-880a-beed137c0b16:0'})
Message(subject=u'usa.news', properties={u'qpid.subject': u'usa.news', 'x-amqp-0-10.routing-key': u'usa.news', u'spout-id': u'ae4555b3-f56b-49f0-a8cc-dfb9b7f18677:0'})
Message(subject=u'usa.faux.news', properties={u'qpid.subject': u'usa.faux.news', 'x-amqp-0-10.routing-key': u'usa.faux.news', u'spout-id': u'e397bf79-b7ec-4c4e-94e3-e0a7c1044f80:0'})

0 件のコメント:

コメントを投稿