2

私は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を精査してきましたが、適切なものが見つからないようです。

4

2 に答える 2

0

クライアントがメッセージを取得する特定のルーティング キーを使用して、ブラウザーからメッセージを送信する方法を実装する必要があります。

ルーティング キーを取得したら、それを message.1 の代わりに queue.bind で使用します。

于 2013-09-02T17:54:47.737 に答える
0

これは、Express、node-AMQP、および SocketIO を使用して NodeJS でそれを行う方法を説明する例です。

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

上に投稿した old_sound のように、サーバー側の app.js ファイルから socket.send を使用すると、socket io 内からクライアント側に値を送​​信できます。

ただし、スケーラビリティのために sock.js を使用することをお勧めします。

于 2013-09-14T23:28:50.017 に答える