4.11.4. XML Exchange のサブスクライブ
以下のコードはキューを作成
myxml
し、XQuery xmlq
と交換にバインドすることで XML 交換にサブスクライブします。
AMQP 0-10
- python
rxXML = ssn.receiver("myxmlq; {create:always, link: { x-bindings: [{exchange:myxml, key:weather, arguments:{xquery:'./weather'} }]}}")
AMQP 1.0
- C++
Receiver rxXML = ssn.createReceiver("myxml/weather; {link: {name:myxmlq, filter:{name:myfilter, descriptor:'apache.org:query-filter:string', value:'./weather'}}}");
XQuery
./weather
は、ボディーコンテンツがルート XML 要素を持つすべてのメッセージと一致し <weather>
ます。
の
key
引数に注意してください x-bindings
。これにより、バインディングに一意の名前があり、名前で削除および更新でき、交換の namespace で匿名であった場合のように、誤って更新されないようにします。
以下のコードは、より複雑な XQuery (AMQP 0-10 アドレス指定を使用)で XML 交換を使用する ことを示しています。
- python
#!/usr/bin/python import sys from qpid.messaging import * conn = Connection("localhost:5672") conn.open() try: ssn = conn.session() tx = ssn.sender("myxml/weather; {create: always, node: {type: topic, x-declare: {exchange: myxml, type: xml}}}") xquerystr = 'let $w := ./weather ' xquerystr += "return $w/station = 'Raleigh-Durham International Airport (KRDU)' " xquerystr += 'and $w/temperature_f > 50 ' xquerystr += 'and $w/temperature_f - $w/dewpoint > 5 ' xquerystr += 'and $w/wind_speed_mph > 7 ' xquerystr += 'and $w/wind_speed_mph < 20' rxaddr = 'myxmlq; {create: always, ' rxaddr += 'link: {x-bindings: [{exchange: myxml, ' rxaddr += 'key: weather, ' rxaddr += 'arguments: {xquery: "' + xquerystr + '"' rxaddr += '}}]}}' rx = ssn.receiver(rxaddr) msgstr = '<weather>' msgstr += '<station>Raleigh-Durham International Airport (KRDU)</station>' msgstr += '<wind_speed_mph>16</wind_speed_mph>' msgstr += '<temperature_f>70</temperature_f>' msgstr += '<dewpoint>35</dewpoint>' msgstr += '</weather>' msg = Message(msgstr) tx.send(msg) rxmsg = rx.fetch(timeout=1) print rxmsg ssn.acknowledge() finally: conn.close()