Action Controller 之 Live

實時推送消息。html

儘可能不要和 Streaming 攪在一塊兒!有相似之處,但仍是請把它們區分開,以便理解!html5

使用 SSE

SSE 全稱 Server Sent Eventweb

提供方法:ruby

close

write

使用舉例:cookie

rubyclass MyController < ActionController::Base
  # 步驟 1
  include ActionController::Live

  def index
    # 步驟 2
    response.headers['Content-Type'] = 'text/event-stream'

    # 步驟 3 封裝了 response.stream
    sse = SSE.new(response.stream, retry: 300, event: "event-name")

    # 步驟 4
    sse.write({ name: 'John'})
    sse.write({ name: 'John'}, id: 10)
    sse.write({ name: 'John'}, id: 10, event: "other-event")
    sse.write({ name: 'John'}, id: 10, event: "other-event", retry: 500)
  ensure
    # 步驟 5
    sse.close
  end
end

不使用 SSE

通常使用都不明確指定 SSE,而是使用默認的 Buffer,舉例:session

rubyclass MyController < ActionController::Base
  # 步驟 1
  include ActionController::Live

  def stream
    # 步驟 2
    response.headers['Content-Type'] = 'text/event-stream'

    100.times {
      # 步驟 3 直接使用 response.stream
      response.stream.write "hello world\n"
      sleep 1
    }
  ensure
    # 步驟 4
    response.stream.close
  end
end

建議 web server 使用 gem 'puma',開發環境下默認使用的 WEBrick 不支持。Unicorn(響應比較快,而且對超時比較嚴格)、Rainbows! 或 Thin 也能夠。ide

實例方法

process

set_response!

response_body=

log_error

process 常見的同名方法,這裏主要是另開一線程進行處理請求。線程

set_response! 也是常見的同名方法,這裏主要是設置 response 爲 Live::Response 的實例對象。code

response_body= 主要是用於確保 response 用完後關閉。server

log_error 記錄錯誤(有的話)。

Live 可用於構建實時聊天之類等。

注意事項

  • content_for 根據狀況,有的要改成 provide

  • 若是模板裏有更改 Headers, cookies, session and flash 的值,將不起做用

  • 部分 middleware 將不能再使用,如:Rack::Bug、Rack::Cache

  • 異常報告和 Web server 的支持

參考

#401 ActionController::Live


Is it live?

相關文章
相關標籤/搜索