如何为浏览器客户端设置RabbitMQ绑定?

时间:2013-09-02 17:47:48

标签: javascript node.js websocket socket.io rabbitmq

我正在使用socket.io将数据消息从RabbitMQ流式传输到浏览器,但到目前为止,我只想出了如何硬编码服务器订阅单个(预先指定的)路由密钥(在它下面的代码是message.1)。我想要做的是创建一个api,以便每个客户端(浏览器会话)可以订阅他们想要的任何路由密钥,并使socket.io流只有订阅的消息给那些客户端。这是我已有的代码:

//app.js    
var express = require('express'),
        routes = require('./routes'),
        api = require('./routes/api'),
        http = require('http'),
        path = require('path');


var amqp = require('amqp'),
    rabbitMq = amqp.createConnection({ url: "amqp://guest:guest@localhost" },
        {defaultExchangeName: "amq.topic"});

var app = module.exports = express(),
    server = http.createServer(app),
    io = require('socket.io').listen(server);


/**
 * Configuration
 */

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);

// development only
if (app.get('env') === 'development') {
  app.use(express.errorHandler());
}

// production only
if (app.get('env') === 'production') {
  // TODO
};


/**
 * Routes
 */

// serve index and view partials
app.get('/', routes.index);
app.get('/partials/:name', routes.partials);

// JSON API
app.get('/api/name', api.name);

// redirect all others to the index (HTML5 history)
app.get('*', routes.index);


rabbitMq.on('ready', function () {
    io.sockets.on('connection', function (socket) {
        var exchange = rabbitMq.exchange('my-exchange',{durable:true});
        var queue = rabbitMq.queue('my-queue',{durable: true});

        queue.bind(exchange,'message.1'); // all messages

        queue.subscribe(function (message) {
            socket.broadcast.emit('message', {
                msg: decodeURIComponent(message.data),
                ts: Date()
            });
            console.log(message);
        });
    });
});


/**
 * Start Server
 */

server.listen(app.get('port'),function() {
    console.log("Express server listening on port " + app.get('port'));
});

我尝试从app.js中取出rabbitMQ代码并将其放入api.js,但这似乎不起作用。关于下一步的任何建议或指导将不胜感激。我一直在网上搜索相关的示例/教程,但似乎找不到合适的示例/教程。

2 个答案:

答案 0 :(得分:0)

您需要实现一种方法,使用您希望客户端从中获取消息的特定路由密钥从浏览器发送消息。

获得该路由密钥后,请在queue.bind中使用它而不是message.1

答案 1 :(得分:0)

这是一个示例,解释了如何使用Express,node-AMQP和SocketIO在NodeJS中执行此操作:

  https://github.com/jamescarr/nodejs-amqp-example/blob/master/node/app.js

正如上面发布的old_sound,您使用来自serverside app.js文件的socket.send,这样做可以让您从socket io中将值发送到客户端。

虽然我建议使用sock.js来实现可伸缩性。