私は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 に配置しようとしましたが、うまくいかないようでした。ここでの次のステップに関するアドバイスやガイダンスをいただければ幸いです。関連する例/チュートリアルについてWebとSOを精査してきましたが、適切なものが見つからないようです。