Я пишу приложение rails с Juggernaut 2 для push-уведомлений в реальном времени и не знаю, как подойти к этой проблеме. У меня есть несколько пользователей в комнате чата, и я хотел бы запустить таймер, чтобы push мог отправляться в каждый браузер в комнате чата каждые 30 секунд. Juggernaut 2 построен на node.js, поэтому я предполагаю, что мне нужно написать этот код там. Я просто не знаю, с чего начать с точки зрения интеграции этого с Juggernaut 2.
Таймеры на стороне сервера с Juggernaut 2
Ответы (3)
Я только что бегло просмотрел Джаггернаут, так что отнеситесь к моему ответу с недоверием ...
- Возможно, вас заинтересует объект Channel (https://github.com/maccman/juggernaut/blob/master/lib/juggernaut/channel.js). Вы заметите, что Channel.channel - это объект (подумайте о рубиновом хэше) все существующие каналы. Вы можете установить 30-секундный повторяющийся таймер (setInterval - http://nodejs.org/docs/v0.4.2/api/timers.html#setInterval), чтобы что-то сделать со всеми вашими каналами.
Что делать на каждой итерации цикла? Что ж, ссылка на вышеупомянутый код канала имеет метод публикации:
publish: function(message){ var channels = message.getChannels(); delete message.channels; for(var i=0, len = channels.length; i < len; i++) { message.channel = channels[i]; var clients = this.find(channels[i]).clients; for(var x=0, len2 = clients.length; x < len2; x++) { clients[x].write(message); } }
}
Таким образом, вам в основном нужно создать объект Message с параметром message.channels, установленным в Channel.channels, и если вы передадите это сообщение методу публикации, оно будет отправлено всем вашим клиентам.
Что касается содержания вашего сообщения, я не знаю, что вы используете на стороне клиента (socket.io? Клиент чата, который кто-то уже построил для вас на Juggernaut и socket.io?), Так что решать вам.
Что касается того, где разместить код, создающий интервал и запускающий обратный вызов для публикации вашего сообщения по всем каналам, вы можете проверить здесь код, который создает фактический сервер, прослушивающий данный порт: (https: // github. com / maccman / juggernaut / blob / master / lib / juggernaut / server.js) Если вы добавите интервал в init (), то, как только вы запустите сервер, он будет проверять каждые 30 секунд, чтобы опубликовать ваше сообщение для каждого канал
Вот пример клиента, который загружает каждые 30 секунд в Ruby.
Установите Juggernaut с Redis и Node: установите ruby и rubygems, затем запустите gem install juggernaut
и
#!/usr/bin/env ruby
require "rubygems"
require "juggernaut"
while 1==1
Juggernaut.publish("channel1","some Message")
sleep 30
end
Мы внедрили систему викторин, которая выдвигала вопросы через переменный интервал времени. Мы сделали это следующим образом:
def start_quiz
Rails.logger.info("*** Quiz starting at #{Time.now}")
$redis.flushall # Clear all scores from database
quiz = Quiz.find(params[:quizz] || 1 )
@quiz_master = quiz.user
quiz_questions = quiz.quiz_questions.order("question_no ASC")
spawn_block do
quiz_questions.each { |q|
Rails.logger.info("*** Publishing question #{q.question_no}.")
time_alloc = q.question_time
Juggernaut.publish( select_channel("/quiz_stream"), {:q_num => q.num, :q_txt => q.text :time=> time_alloc} )
sleep(time_alloc)
scoreboard = publish_scoreboard
Juggernaut.publish( select_channel("/scoreboard"), {:scoreboard => scoreboard} )
}
end
respond_to do |format|
format.all { render :nothing => true, :status => 200 }
end
end
Ключевым моментом в нашем случае было использование «спауна» для запуска фонового процесса для времени викторины, чтобы мы могли обрабатывать поступающие оценки.
Я понятия не имею, насколько это масштабируемо.