Jak usunąć Redis na' message'
Typowy przykład czatu Redis pójdzie coś takiego (zobacz https://github.com/emrahayanoglu/Socket.io-Redis-RealTime-Chat-Example/blob/master/chatServer.js{[8]tylko jeden taki przykład):
io.sockets.on('connection', function (client) { //websocket connection
redis1.subscribe("chat");
redis1.on("message", function(channel, message) {
console.log(message);
client.send(message);
});
client.on('message', function(msg) {
redis2.publish("chat",msg.message);
});
client.on('disconnect', function() {
redis1.quit();
});
});
Problem polega jednak na tym, że gdy client
'rozłączyć', redis1.on('message',FUNC(){})
słuchacz jest nadal dołączony. Konsola będzie nadal drukować message
. Gdyby ktoś sprawdzał listę zdarzeń redis1
, nadal znajdowałby funkcję Anonymous nasłuchującą.
Problem polega na tym, że nie ma redis1.off(...)
funkcji. W jaki sposób można odłączyć/anulować subskrypcję/usunąć / usunąć słuchacza wiadomości redis?
Uwaga: nie można po prostu zrobić redis1.end (), ponieważ spowoduje to przerwanie połączenia redis dla innych użytkowników podłączonych do websocket.
1 answers
Jedynym rozwiązaniem, które znalazłem, bawiąc się w REPL węzła jest nie używać funkcji redis.on()
do subskrybowania. Zamiast tego należy użyć funkcji redis.addListener()
i redis.removeListener()
. Ponadto nie wolno używać funkcji anonimowych jako wywołań zwrotnych zdarzeń.
Można by zrobić coś takiego:
var callback = function(channel, message){
};
redis1.addListener('message', callback);
client.on('disconnect', function(){
redis1.removeListener('message', callback);
})
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-23 17:53:50