2013-09-02 3 views
1

Я использую socket.io для передачи данных из RabbitMQ в браузер, но до сих пор я только выяснил, как жестко закодировать сервер для подписки на один (заданный) ключ маршрутизации (в коде ниже message.1). То, что я хотел бы сделать, это создать api, чтобы каждый клиент (сеанс браузера) мог подписаться на любые ключи маршрутизации, которые они хотели бы, и имел бы socket.io поток только подписанных сообщений этим клиентам. Вот код, у меня уже есть:Как настроить привязку RabbitMQ для клиентов браузера?

//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:[email protected]" }, 
     {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')); 
}); 

Я пытался принимать код RabbitMQ из app.js и поместить его в api.js, но это не похоже на работу. Любые советы или рекомендации относительно следующего шага здесь будут оценены. Я просматриваю веб-страницы и SO для соответствующих примеров/учебников, но не могу найти подходящих.

ответ

0

Вам необходимо реализовать способ отправки сообщения из браузера с помощью определенного ключа маршрутизации, с которого вы хотите, чтобы клиент получал сообщения.

После того, как вы получите, что ключ маршрутизации, использовать его в queue.bind вместо message.1

+0

Правильно, как это сделать? Это то, о чем я прошу. –

+0

Прочтите документы о socket.send(); от клиента и socket.onmessage() с сервера. Это делается для этого. Еще один будет использовать параметры GET/POST. Это зависит от того, что лучше подходит вашей проблеме. –

+0

Я хочу сделать это с помощью REST, но до сих пор не понял, как это сделать. –

0

Это пример, который объясняет, как сделать это в NodeJS с Express, узел-AMQP и SocketIO:

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

Как указано в old_sound, вы используете socket.send из файла app.js serveride, делая это позволяет отправлять значение на стороне клиента из сокета io.

Хотя я бы рекомендовал использовать sock.js для масштабируемости.

Смежные вопросы