Таймеры на стороне сервера с Juggernaut 2

Я пишу приложение rails с Juggernaut 2 для push-уведомлений в реальном времени и не знаю, как подойти к этой проблеме. У меня есть несколько пользователей в комнате чата, и я хотел бы запустить таймер, чтобы push мог отправляться в каждый браузер в комнате чата каждые 30 секунд. Juggernaut 2 построен на node.js, поэтому я предполагаю, что мне нужно написать этот код там. Я просто не знаю, с чего начать с точки зрения интеграции этого с Juggernaut 2.


person TenJack    schedule 08.03.2011    source источник
comment
Разве github.com/maccman/juggernaut не объясняет, с чего начать?   -  person Dmytrii Nagirniak    schedule 08.03.2011
comment
Да, Juggernaut работает, и у меня есть приложение для чата, я просто пытаюсь добавить таймер на стороне сервера в node.js и интегрировать его с Juggernaut.   -  person TenJack    schedule 09.03.2011


Ответы (3)


Я только что бегло просмотрел Джаггернаут, так что отнеситесь к моему ответу с недоверием ...

  1. Возможно, вас заинтересует объект 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), чтобы что-то сделать со всеми вашими каналами.
  2. Что делать на каждой итерации цикла? Что ж, ссылка на вышеупомянутый код канала имеет метод публикации:

    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 секунд, чтобы опубликовать ваше сообщение для каждого канал

person ambertch    schedule 08.03.2011
comment
Все еще пытаюсь во всем разобраться. Это отличное зацепление, большое спасибо. - person TenJack; 09.03.2011
comment
ТенДжек - что смущает? Дай мне знать, и я могу попытаться помочь - person ambertch; 13.03.2011
comment
Привет, ambertech! Главное, с чем я сейчас борюсь, это то, что я хотел бы запустить таймер для определенного имени канала, а не для всех каналов. Мне нужно иметь возможность запускать таймер для каждой отдельной комнаты чата. Спасибо за любую помощь. - person TenJack; 14.03.2011

Вот пример клиента, который загружает каждые 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
person Peter    schedule 31.05.2011

Мы внедрили систему викторин, которая выдвигала вопросы через переменный интервал времени. Мы сделали это следующим образом:

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

Ключевым моментом в нашем случае было использование «спауна» для запуска фонового процесса для времени викторины, чтобы мы могли обрабатывать поступающие оценки.

Я понятия не имею, насколько это масштабируемо.

person Andy    schedule 12.07.2011