nodejs rabbitmq使用
var amqp = require('amqp') 1. 一个发送者, 多个消费者。 exchange发送3条消息, 每个队列接收3条消息相同 connection.on('ready', function () { var exchange = connection.exchange('exchange_name', { type: 'fanout', autoDelete: false }); connection.queue("queue_name", { autoDelete: false }, function (queue) { queue.bind('exchange_name', 'queue_name', function () { exchange.publish('queue_name', 'this is message is testing ......'); exchange.publish('queue_name', 'this is message is testing3 ......') setTimeout(function () { console.log("Single queue bind callback succeeded"); //exchange.destroy(); //queue.destroy();node connection.end(); connection.destroy(); }, 5000); }) //同一个消息多次订阅同一个队列,只会收到一次消息 /* ack:true,确认收到一条消息后,后续对列中的消息接收不到 prefetchCount:每个消费者接收的消息平均, */ // queue.subscribe({ack:true,prefetchCount:1},function (message) { // console.log('2At 5 second recieved message is:'+ message.data); // }); // queue.subscribe({ack:true,prefetchCount:1},function (message) { // console.log('At 5 second recieved message is:'+ message.data); // }); queue.subscribe(function (message) { console.log('2At 5 second recieved message is:' + message.data); }); // queue.subscribe(function (message) { // console.log('1 5 second recieved message is:'+ message.data); // }); }) connection.queue("queue_name1", { autoDelete: false }, function (queue) { queue.bind('exchange_name', 'queue_name1', function () { exchange.publish('queue_name1', 'this is queue_name1 is testing4 ......') }) queue.subscribe(function (message) { console.log('queue_name1 5 second recieved message is:' + message.data); }); }) }) 打印: queue_name1 5 second recieved message is: this is message is testing...... 2 At 5 second recieved message is: this is message is testing...... 2 At 5 second recieved message is: this is message is testing3...... queue_name1 5 second recieved message is: this is message is testing3...... 2 At 5 second recieved message is: this is queue_name1 is testing4...... queue_name1 5 second recieved message is: this is queue_name1 is testing4...... 2. exchange的type为direct, 每个个队列, 只能收到指定的队列消息 connection.on('ready', function () { var exchange = connection.exchange('exchange_name2', { type: 'direct', autoDelete: false }); connection.queue("queue_name", { autoDelete: false }, function (queue) { queue.bind('exchange_name2', 'queue_name', function () { exchange.publish('queue_name', 'this is message is testing ......'); exchange.publish('queue_name', 'this is message is testing2222 ......'); setTimeout(function () { console.log("Single queue bind callback succeeded"); //exchange.destroy(); //queue.destroy(); connection.end(); connection.destroy(); }, 5000) }) queue.subscribe(function (message) { console.log('At 2:' + message.data); }) queue.subscribe(function (message) { console.log('At 1:' + message.data); }) }) connection.queue('q2', { autoDelete: false }, function (q) { q.bind('exchange_name2', 'q2', function () { exchange.publish('q2', 'is form q2') }) q.subscribe(function (msg) { console.log("q2: " + msg.data) }) }) }) 打印: At 2: this is message is testing...... At 1: this is message is testing2222...... q2: is form q2 3. 参数尝试, echange, queue, publish持久化 const amqp = require('amqp'); var connection = amqp.createConnection({ host: '127.0.0.1', port: 5672, login: 'test', password: '123', vhost: '/test' }); connection.on('error', function (err) { console.log('Connection error', err); }); connection.on('ready', function () { // Options // - type 'fanout', 'direct', or 'topic' (default) // - passive (boolean) // - durable (boolean) // - autoDelete (boolean, default true) var exchange = connection.exchange('exchange_name', { type: 'fanout', autoDelete: false }); // - passive (boolean) // - durable (boolean)持久化 // - exclusive (boolean) // - autoDelete (boolean, default true) //'arguments': {'x-expires': 3600000} connection.queue("queue_name8", { autoDelete: false, durable: true }, function (queue) { queue.bind('exchange_name', 'queue_name8', function () { // the third argument can specify additional options // - mandatory (boolean, default false) // - immediate (boolean, default false) // - contentType (default 'application/octet-stream') // - contentEncoding // - headers // - deliveryMode // - priority (0-9) // - correlationId // - replyTo // - expiration // - messageId // - timestamp // - userId // - appId // - clusterId // exchange.publish('queue_name8', 'this is message is testing ......', { deliveryMode: 2 }); exchange.publish('queue_name8', 'this is message is testing3 ......', { deliveryMode: 2 }) setTimeout(function () { console.log("Single queue bind callback succeeded"); //exchange.destroy(); //queue.destroy();node connection.end(); connection.destroy(); }, 5000); }) //同一个消息多次订阅同一个队列,只会收到一次消息 /* ack:true,确认收到一条消息后,后续对列中的消息接收不到,如果需要下条消息,调用q.shift() prefetchCount:每个消费者接收的消息平均, */ // queue.subscribe({ack:true,prefetchCount:1},function (message) { // console.log('2At 5 second recieved message is:'+ message.data); // }); // queue.subscribe({ack:true,prefetchCount:1},function (message) { // console.log('At 5 second recieved message is:'+ message.data); // }); queue.subscribe(function (message) { console.log('2At 5 second recieved message is:' + message.data); }); // queue.subscribe(function (message) { // console.log('1 5 second recieved message is:'+ message.data); // }); }) connection.queue("queue_name9", { autoDelete: false, durable: true }, function (queue) { queue.bind('exchange_name', 'queue_name9', function () { exchange.publish('queue_name9', 'this is queue_name1 is testing4 ......', { deliveryMode: 2 }) }) queue.subscribe(function (message) { console.log('queue_name1 7 second recieved message is:' + message.data); }); }) }) 4. 确认收到消息, 继续接收消息 var queName = 'test_q3', ex = 'test_ex'; connection.on('ready', function () { var ex = connection.exchange(`${ex}`, { type: 'fanout', durable: true, autoDelete: false }); connection.queue(`${queName}`, { durable: true, autoDelete: false }, function (q) { q.bind(ex, queName, function () { ex.publish(queName, 'test msg1', { deliveryMode: 2 }) ex.publish(queName, 'test msg2 msg2', { deliveryMode: 2 }) }) setTimeout(function () { console.log("Single queue bind callback succeeded"); //exchange.destroy(); //queue.destroy();node connection.end(); connection.destroy(); }, 1000); q.subscribe({ ack: true, prefetchCount: 1 }, function (msg) { q.shift() console.log('receive msg : ' + msg.data); }) }) }) 注意: 同一个exhcange中的queuename, exhcange, type方式一旦在程序中确定, 就不能改变