Передача сообщений между соединениями EventMachine

Я пытаюсь написать сервер чата с помощью EventMachine. Как передать сообщение из одного соединения EventMachine в другое потокобезопасным способом?

Я вижу, что поддерживается протокол обмена сообщениями (Stomp), но не могу понять, как его использовать. Любая помощь приветствуется.

Stomp в EventMachine — http://eventmachine.rubyforge.org/EventMachine/Protocols/Stomp.html


person sparkymat    schedule 16.10.2012    source источник
comment
1. Реализация протокола EM Stomp является клиентом, а не сервером. 2. EM ничего не должен делать с Thread (если только вы не используете defer для некоторых особых случаев)   -  person phil pirozhkov    schedule 22.10.2012


Ответы (2)


См. http://eventmachine.rubyforge.org/EventMachine/Channel.html.

вы можете попробовать что-то в этих строках:

require 'eventmachine'

class Chat < EventMachine::Connection  
  def initialize channel
    @channel = channel
  end

  def post_init
    send_data 'Hello'
    @sid = @channel.subscribe do |msg|
      send_data msg
    end
  end

  def receive_data(msg)
    @channel.push msg
  end

  def unbind
    @channel.unsubscribe @sid
  end
end

EM.run do
  @channel = EventMachine::Channel.new
  EventMachine.start_server '127.0.0.1', 8081, Chat, @channel
end

РЕДАКТИРОВАТЬ: также проверьте https://github.com/eventmachine/eventmachine/tree/master/examples/guides/getting_started — хороший пример чата

person bbozo    schedule 13.11.2013

Попробуйте начать с диспетчера сообщений в памяти.

require 'thread'

class Room
  def initialize
    @users = []
  end

  def join(user)
    @users << user
  end

  def leave(user)
    @user.delete(user)
  end

  def broadcast(message)
    @users.each do |user|
      user.enqueue(message)
    end
  end
end

class User

  def initialize
    @mutex = Mutex.new
    @queued_messages = []
  end

  def enqueue(message)
    @mutex.synchronize do
      @queued_message << message
    end
  end

  def get_new_messages
    @mutex.synchronize do
      output = @queued_messages
      @queued_messages = []
    end
    return output
  end

end

ОБНОВЛЕНИЕ

ROOM = Room.new

class Connection
  def user_logged_in
    # @user = ...
    ROOM.join(@user)
  end

  def received_message(message)
    ROOM.broadcast(message)
  end

  def receive_send_more_messages_request(req)
    messages = @user.get_new_messages
    # write messages
  end

  def connection_closed
    ROOM.leave(@user)
  end
end
person simonmenke    schedule 16.10.2012
comment
Логика происходит внутри объектов EventMachine::Connection, и как мне заставить их проснуться и проверить наличие сообщения? - person sparkymat; 16.10.2012