2015-08-17 36 views
0

我一直在构建一个使用RabbitMQ作业的webapp。有3-5名员工处理队列中的数据,偶尔有一名员工需要向所有员工发送消息。发布消息给多位RabbitMQ消费者

我一直在阅读的RabbitMQ文档,但已经有很多的麻烦找到什么有用的东西。

当新员工启动时,它会生成一个UUID(v6),然后订阅队列worker.{id},例如worker.7a277e65-8df4-4670-99b4-52c13478831d

从其他问题,我已经能够解决,我需要创建一个话题交换,让工作人员发布消息到worker.*,让它发送给每个工人。

不过,我对这个应该怎么做不确定。我使用jackrabbit,它不支持编程创建的交流,所以我需要通过RabbitMQ的管理控制台来做到这一点,它看起来像这样:

你能提供意见的交换类型我应该创建参数,并且如果它不能像通常的队列那样处理,那么可能是一个使用示例?

回答

0

如果兔崽子不允许你指定的交流,队列或绑定,那么你就需要找到另一个库。

问题是你的绑定。如您所见,您可以从管理界面创建交换,队列和绑定。但是,在Jackrabbit创建特定于工作人员的队列时,您将无法在交换和Jackrabbit创建的队列之间创建绑定。

我使用,并强烈建议,在wascally库。它建立在amqplib之上,与Jackrabbit相同,但提供了更多功能丰富的API和功能。

至于如何使用Wascally ...设置三个文件与此代码的例子:

config.json


{ 
    "connection": { 
    "user": "test", 
    "pass": "password", 
    "server": "localhost", 
    "vhost": "test-app" 
    }, 

    "exchanges":[ 
    {"name": "sample-ex.1", "type": "direct"} 
    ], 

    "queues":[ 
    {"name": "sample-q.1"} 
    ], 

    "bindings":[ 
    {"exchange": "sample-ex.1", "target": "sample-q.1"} 
    ] 
} 

receiver.js


var rabbit = require("wascally"); 
var config = require("config.json"); 

rabbit.configure(config) 
    .then(function(){ 
    rabbit.handle("test.message.type", handleMessage); 
    rabbit.startSubscription("sample-q.1"); 
    }) 
    .then(undefined, reportError); 

function reportError(err){ 
    console.log(err.stack); 
    process.exit(); 
} 

function handleMessage(msg){ 
    var body = msg.body; 

    console.log("received a message"); 
    console.log(body); 
    msg.ack(); 

    setTimeout(function(){ 
    // do work 
    }, 5000); 
} 

sender.js


var rabbit = require("wascally"); 
var config = require("config.json"); 

rabbit.configure(config) 
    .then(function(){ 
    rabbit.publish("sample-ex.1", { 
     type: "test.message.type", 
     routingKey: "", 
     body: { 
     foo: "bar" 
     } 
    }); 
    }) 
    .then(undefined, reportError); 

function reportError(err){ 
    console.log(err.stack); 
    process.exit(); 
} 

现在,只要你想,你可以创建接收器的多个实例。几次运行node receiver.js

然后运行node sender.js几次,您将看到通过接收器传来的消息 - 一个接收器收到一条消息,rabbitmq会将消息循环到接收器。


p.s.如果您有兴趣,此代码来自我的RabbitMQ For Devs包中的屏幕录像。