實時推送消息。html
儘可能不要和 Streaming 攪在一塊兒!有相似之處,但仍是請把它們區分開,以便理解!html5
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,而是使用默認的 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 的支持
參考