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 件のコメント:
コメントを投稿