emptyQueue:function (clientId) { if (!this._server.hasConnection(clientId)) { this._server.debug('Does not have connection for: ?', clientId); return; } var key = this._ns + '/clients/' + clientId + '/messages', self = this, redis = this._getShard(clientId).redis, multi = redis.multi(); multi.lrange(key, 0, -1, function (error, jsonMessages) { if (error) { return; } var messages = jsonMessages.map(function (json) { return JSON.parse(json) }); self._server.deliver(clientId, messages); }); multi.del(key); multi.exec(function(err) { if (err) { self._server.error('redis error from exec: ?', err.message); } }); },
redis.get(key, function(err, rs){ // Параметры запроса var params = []; // Является ли процесс генератором var isGenerator = false; /** * prepareData Функция обработки результата */ var prepareData = function(){ // Если процесс стал генератором тогда запускаем генерирование сообщений if(isGenerator) generator.call(redis); // Становимся просто слушателем else notGenerator.call(redis); // Устанавливаем таймер времени ожидания на 2.5 секунды setTimeout(checkGenerator, 2500); }; // Проверяем существует ли генератор // Если не существует то создаем себя в качестве генератора if(!rs){ // Запоминаем что процесс стал генератором isGenerator = true; // Формируем ключ params.push(["set", key, appID]); // Если мы уже являемся генератором } else if(parseInt(rs, 10) === parseInt(appID, 10)) isGenerator = true; // Выполняем обработку результата if(!isGenerator) prepareData(); // Если это генератор то обновляем значение else { // Устанавливаем время жизни ключа в 3 секунды params.push(["EXPIRE", key, 3]); // Записываем данные в Redis redis.multi(params).exec(prepareData); } });
timer = setInterval(function(){ // Ключа сообщения var key = "message"; // Выполняем чтение данных var params = [ ["set", key, getMessage()], ["EXPIRE", key, 3] ]; // Отправляем сообщения в Redis redis.multi(params).exec(); }, 500);
}), function(err) { // ... and then clear out the client, and trigger a close event. if (err) { if (callback) callback.call(context); return; } var multi = redis.multi(); multi.del(self._ns + '/clients/' + clientId + '/messages'); multi.zrem(self._ns + '/clients', clientId); multi.publish(shard.closeChannel, clientId); multi.exec(function(err, results) { if (err) { if (callback) callback.call(context); return; } self._server.debug('Destroyed client ?', clientId); self._server.trigger('disconnect', clientId); if (callback) callback.call(context); }); });