【发布时间】:2015-05-04 04:17:35
【问题描述】:
我实际上是在尝试使用 node-amqp (https://github.com/postwait/node-amqp) 来实现 pub/sub 模式。
我在实现它时遇到了一些问题。
我需要什么:
- 发布来自用户的消息
- 广播给其他用户
- 将消息发送给离线用户,他们将在下次连接时使用它
我的实际情况:
(function () {
var amqp = require('amqp');
var connection = amqp.createConnection({ host: 'http://127.0.0.1:5672/' });
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
server.listen(8888);
// Wait for connection to become established.
connection.on('ready', function () {
var sendMessage = function (queue, msg) {
connection.publish(queue, JSON.stringify(msg));
}
io.sockets.on('connection', function (socket) {
socket.on('message', function (msg) {
sendMessage('my-queue', msg);
});
connection.queue('my-queue', {autoDelete: false}, function (q) {
q.bind('#');
q.subscribe(function (message) {
socket.broadcast.emit('news',message);
});
});
});
});
})()
- 在 index.html 页面上,我连接到套接字服务器
- 我有一个发送消息的按钮
- 我在索引页面上打开了两个不同的浏览器,我的用户都已连接
- 如果我向服务器发送消息,它会将其发送给其他用户
- 如果我向服务器发送第二条消息,它会将消息发送给发送消息的用户。
正在切换,每对消息(因为我有两个用户),其他用户收到消息,如果是损坏消息,当前发送消息的用户收到消息。 这是什么行为?
你能帮我更正我的代码以实现我的需求吗?
注意:我在 Windows 7 x64 计算机上使用带有标准配置的 RabbitMQ
编辑:我提出了一个解决方案,每个消费者都可以通过以下方式获得消息:
(function () {
var amqp = require('amqp');
var connection = amqp.createConnection({ host: 'http://127.0.0.1:5672/' });
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.get('/', function (req, res) {
res.sendfile(__dirname + '/index.html');
});
server.listen(8888);
// Wait for connection to become established.
connection.on('ready', function () {
connection.exchange('logs', {type: 'fanout', autoDelete: false}, function (exchange) {
var sendMessage = function (queue, msg) {
exchange.publish(queue, JSON.stringify(msg));
}
io.sockets.on('connection', function (socket) {
socket.on('message', function (msg) {
sendMessage('', msg);
});
connection.queue(socket.id, {exclusive: true}, function (q) {
q.bind('logs', '');
q.subscribe(function (message) {
socket.emit('news', message);
});
});
});
});
});
})()
我的最后一个问题是我现在无法管理离线消息...有什么解决方案吗? (赏金明天结束:-/)
【问题讨论】:
标签: node.js socket.io rabbitmq amqp