Javascript 使用Node.js中的RabbitMQ交换头示例

Javascript 使用Node.js中的RabbitMQ交换头示例,javascript,node.js,express,rabbitmq,amqp,Javascript,Node.js,Express,Rabbitmq,Amqp,我一直在到处寻找头交换的例子,使用Node.js中的RabbitMQ。如果有人能给我指出正确的方向,那就太好了。以下是我目前掌握的情况: 发布者方法(创建发布者) 发布方法 RabbitMQ.prototype.publish = function(exchange, routingKey, content, headers) { try { publishers[exchange].assert.then(function(){ publishers[exch

我一直在到处寻找
头交换
的例子,使用Node.js中的RabbitMQ。如果有人能给我指出正确的方向,那就太好了。以下是我目前掌握的情况:

发布者方法(创建发布者)

发布方法

RabbitMQ.prototype.publish = function(exchange, routingKey, content, headers) {
 try {    
    publishers[exchange].assert.then(function(){
        publishers[exchange].ch.publish(exchange, routingKey, new Buffer(content), { persistent: true, headers: headers }, function(err, ok) {
            if (err) {
                console.error("[AMQP] publish", err);
                offlinePubQueue.push([exchange, routingKey, content]);
                publishers[exchange].ch.connection.close();
            }
        });
    });
 } catch (e) {                                                                                                                               
    console.error("[AMQP] publish", e.message);
    offlinePubQueue.push([exchange, routingKey, content]);
 }
};
消费者方法(创建消费者)

上面的示例适用于
主题
,但我不确定如何转换到
标题
。我非常确定我需要改变我的绑定方法,但是还没有找到任何关于如何实现这一点的例子


任何帮助都将不胜感激

我无意中发现了这个问题,并在寻找相同的答案。不幸的是,像你一样,我发现一切都是可用的。在查看了源代码、阅读了一点协议并尝试了一些组合之后,我终于做到了

...
let opts = { headers: { 'asd': 'request', 'efg': 'test' }};
chan.publish(XCHANGE, '', Buffer.from(output), opts);
...

完整的工作代码如下。下面的身份验证信息是伪造的,因此您必须使用自己的身份验证信息。我还使用ES6、nodejs版本6.5和amqplib。给头
x-
前缀和/或使用保留字作为头名称可能会有问题,但我不太确定(我必须查看RabbitMQ源代码)

emit.js:

#/usr/bin/env节点
constxchange='headers exchange';
常数Q=要求('Q');
const Broker=require('amqplib');
让作用域='匿名';
process.on('uncaughtException',(exception)=>{
console.error(`::error::uncaughtexception${exception}`);
});
process.argv.slice(2.forEach)((arg)=>
{
范围=arg;
info(“[*]范围现在设置为“+范围);
});
Q.spawn(函数*()
{
让conn=yieldbroker.connect('amqp://root:root@localhost');
让chan=屈服连接createChannel();
chan.assertExchange(XCHANGE,'headers',{dustable:false});
对于(让计数为0;计数为++计数%3)
{
让输出=(新日期()).toString();
let opts={headers:{'asd':'request','efg':'test'};
chan.publish(交换),Buffer.from(输出),opts);
log(`[x]已发布项“${output}”到`);
产量Q.延迟(500);
}
});
receive.js:

#!/usr/bin/env节点
常数Q=要求('Q');
const Broker=require('amqplib');
const uuid=require('node-uuid');
常数Rx=需要('Rx');
Rx.Node=require('Rx-Node');
constxchange='headers exchange';
const WORKER_ID=uuid.v4();
const-WORKER\u-SHORT\u-ID=WORKER\u-ID.substr(0,4);
Q.spawn(函数*(){
让conn=yieldbroker.connect('amqp://root:root@localhost');
让chan=屈服连接createChannel();
chan.assertExchange(XCHANGE,'headers',{dustable:false});
设q=yield chan.assertQueue(“”,{exclusive:true});
让opts={'asd':'request','efg':'test','x-match':'all'};
chan.bindQueue(q.queue,XCHANGE,,,opts);
console.info('[*]与'+JSON.stringify(opts)绑定);
日志(`[*]订户${WORKER\u ID}(${WORKER\u SHORT\u ID})已联机!`);
chan.consume(q.queue,(msg)=>
{
console.info(`[x](${WORKER\u SHORT\u ID})接收到发布“${msg.content.toString()}”`);
陈.ack(msg),;
});
});
RabbitMQ.prototype.consumer = function(exchange, type, routingKey, cb) {
 amqp.then(function(conn) {
  conn.createChannel().then(function(ch) {

    var ok = ch.assertExchange(exchange, type, {durable: true});

    ok.then(function() {
      ch.assertQueue('', {exclusive: true});
    });

    ok = ok.then(function(qok) {
      var queue = qok.queue;
      ch.bindQueue(queue,exchange,routingKey)
    });

    ok = ok.then(function(queue) {
      ch.consume(queue, function(msg){
            cb(msg,ch);
      }, {noAck: false});
    });

    ok.then(function() {
      console.log(' [*] Waiting for logs. To exit press CTRL+C.');
    });

  });
 }).then(null, console.warn);
};
...
let opts = { headers: { 'asd': 'request', 'efg': 'test' }};
chan.publish(XCHANGE, '', Buffer.from(output), opts);
...
...
let opts = { 'asd': 'request', 'efg': 'test', 'x-match': 'all' };
chan.bindQueue(q.queue, XCHANGE, '', opts);
...