さて今回は本家チュートリアル 4 Routing をやってまいります。
Routing と言ったって Receiver 側で名前を OR で待ち受けれるだけと言う簡単な機能です。
pub_r.js
#!/usr/bin/env node const amqp = require('amqplib'); const my = require('./my.js'); async function main() { const a = getArgs(); const conn = await amqp.connect(my.conf).catch(my.die); const ch = await conn.createChannel(); await ch.assertExchange(a.exchange, 'direct', { durable: false }); const q = await ch.assertQueue('', { exclusive: true }); a.routingKeys.split(',').forEach(async routingKey => { await ch.bindQueue(q.queue, a.exchange, routingKey); }); console.log('Waiting exchange=%s, routing_keys=%s', a.exchange, a.routingKeys); await ch.consume(q.queue, msg => { console.log('Received: %s', msg.content.toString()); }, { noAck: true } ); }; main(); function getArgs() { if (process.argv.length < 4) { usage(); } return { exchange: process.argv[2], routingKeys: process.argv[3] }; } function usage() { const usage = `sub_r.js EXCHANGE_NAME ROUTING_KEYS(CSV)`; console.log(usage); process.exit(); }
await ch.assertExchange(a.exchange, 'direct', { durable: false });
Exchange のタイプを direct にします。
a.routingKeys.split(',').forEach(async routingKey => { await ch.bindQueue(q.queue, a.exchange, routingKey); });
bindQueue する時に、第3引数に対して待ち受ける routingKey を指定します。複数指定が可能です。
次は Sender 側。
sub_r.js
#!/usr/bin/env node const amqp = require('amqplib'); const my = require('./my.js'); async function main() { const a = getArgs(); const conn = await amqp.connect(my.conf).catch(my.die); const ch = await conn.createChannel(); await ch.publish(a.exchange, a.routingKey, Buffer.from(a.msg)); console.log('Published exchange=%s, routing_key: %s', a.exchange, a.routingKey, a.msg); await ch.close(); await conn.close(); }; main(); function getArgs() { if (process.argv.length < 5) { usage(); } return { exchange: process.argv[2], routingKey: process.argv[3], msg: process.argv.slice(3).join(' '), }; } function usage() { const usage = `pub_r.js EXCHANGE_NAME ROUTING_KEY MESSAGE`; console.log(usage); process.exit(); }
await ch.publish(a.exchange, a.routingKey, Buffer.from(a.msg));
publish 時に routingKeys を与えます。
では早速コマンドを実行し挙動を見てみましょう。
./sub_r routing aaa
./sub_r routing aaa,bbb
と2つ Receiver を立ち上げ
./pub_r routing aaa AAA
./pub_r routing bbb BBB
と Sender で Message を投げてみてください。
aaa には AAA だけが
aaa,bbb には AAA と BBB が表示されます。
さて次回は、チュートリアル 5 に相当する Topic をやっていきます。Topic と言うとこれまたわけがわかりませんが、単なる部分一致です。