我实际上是尝试使用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);
});
});
});
});
})()
它切换,每对消息(因为我有两个用户),其他用户得到消息,如果它是一个损害消息,发送消息的当前用户接收消息。 这是什么行为?
你能帮助我纠正我的代码以实现我的需求吗?
注意:我在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);
});
});
});
});
});
})()
我的最后一个问题是我现在无法管理离线消息......任何解决方案? (赏金明天结束: - /)
答案 0 :(得分:3)
问题是RabbitMQ会故意将每条消息发送给单个用户。该用户确认收到了消息(amqp does this for you automatically),然后就RabbitMQ而言已完成工作,因此删除了该消息。
您的用户轮流接收邮件的原因是RabbitMQ尝试在用户上均匀地传播加载传入邮件。
您的问题已在here之前得到解答。检查一下你的问题的解决方案!
答案 1 :(得分:2)
您需要为每个使用者(在您的情况下为用户)创建单独的队列,并将消息从交换路由到所有这些队列。这样,当您发布消息时,它将被放置在所有用户中。队列,每个队列都可以独立使用它。
你有这个: http://www.rabbitmq.com/tutorials/tutorial-two-python.html
你需要这个: http://www.rabbitmq.com/tutorials/tutorial-three-python.html