将另一个URL插入WebSocket :: EventMachine Iterator

时间:2016-01-21 13:16:58

标签: ruby-on-rails ruby websocket eventmachine

我们说我有以下网址列表:

urls = ['socket1.com', 'socket2.com']

我设置了一个EventMachine Iterator来打开与这些套接字的连接

require 'websocket-eventmachine-client'

EM.run do
  EM::Iterator.new(urls, urls.size).each do |url, iterator|
    socket = WebSocket::EventMachine::Client.connect(uri: url)

    socket.onopen {puts "open #{url}"}
    socket.onmessage {|msg, type| puts msg}
    socket.onclose {|code, reason| puts "closed #{url}"}
  end
end

使用该代码,我认为如果需要,我可以添加到另一个URL的连接。 我需要做的是添加另一个连接,例如socket3.com,同时不影响其他连接。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我不确定EM Iterator是否是最好的工具,因为您希望在迭代它时可能添加到阵列中,这听起来不是很安全。从你的描述来看,听起来更像是你需要一个可以在添加新URL时响应的发布/订阅式队列。这样的事情可能有用(警告100%未经测试!):

class EMCallbackQueue

  attr_accesor :callback

  def push(item)
    callback.call(item)
  end

end


require 'websocket-eventmachine-client'

EM.run do

  callback_queue = EMCallbackQueue.new

  # Assign a proc to the callback, this will called when a new url is pushed on the Queue
  callback_queue.callback = ->(url){ 
    socket = WebSocket::EventMachine::Client.connect(uri: url)
    socket.onopen {puts "open #{url}"}
    socket.onmessage {|msg, type| puts msg}

    # Maybe add to the callback queue from within a callback
    # based on the msg from the current connection
    callback_queue.push "additionsocket.com"

    socket.onclose {|code, reason| puts "closed #{url}"}
   }

   callback_queue.push "socket1.com"
   callback_queue.push "socket2.com"

end

EMCallbackQueue只是回调过程的一个包装器,当附加新的url时,调用callback proc,并且因为它全部在eventmachine中,所以WebSocket :: EventMachine: :客户端将在reactor循环的下一个tick上处理url,允许其余代码运行,这反过来将排队更多url。