2015-12-04 54 views
0

我正在寫Rails應用程序,並且我希望用戶在新消息保存到數據庫後能夠收到通知。對於websocket,我使用em-websocket寶石。連接後,我將客戶端ID和套接字實例存儲在數組中。Rails push EM-Socket

問題:如何從控制器\模型動作(例如before_save)將數據推送到客戶端?它能夠使用em-websocket嗎?

chat.rb

EVENTCHAT_CONFIG = YAML.load_file("#{Rails.root}/config/eventchat.yml")[Rails.env].symbolize_keys 

#escape html/xss 
include ERB::Util 

Thread.abort_on_exception = true 

Thread.new { 
    EventMachine.run { 
    @sockets = Array.new 

    EventMachine::WebSocket.start(EVENTCHAT_CONFIG) do |ws| 
     ws.onopen do 

     end 

     ws.onclose do 
     index = @sockets.index {|i| i[:socket] == ws} 
     client = @sockets.delete_at index 
     @sockets.each {|s| s[:socket].send h("#{client[:id]} has disconnected!")} 
     end 

     ws.onmessage do |msg| 
     client = JSON.parse(msg).symbolize_keys 
     case client[:action] 
     when 'connect' 
      @sockets.push({:id=>client[:id], :socket=>ws}) 
      @sockets.each {|s| s[:socket].send h("#{client[:id]} has connected!")} 
     when 'say' 
      @sockets.each {|s| s[:socket].send h("#{client[:id]} says : #{client[:data]}")} 
     end 
     end 
    end 
    } 
} 

回答

0

當部署 - 您可能必須與具有對一些沒有綁定到插座或並不是所有的用戶接收的每個軌工人(一個獨立的EM反應器,例如錯誤的問題所有消息)

與websocket reactor相關的Rails控制器只是另一種類型的客戶端,最簡單的方法是使用特殊的客戶端ID打開連接,然後推入一些數據並關閉它。更有效的方式 - 是保持每個軌道工人

打開的連接如果基於EM-單進程的服務器使用(例如 - thin),你可以使用EM::Queue將消息傳送給WebSocket的工人進程或甚至直接從控制器寫入websocket