[英]How to use ActionController::Live along with Resque + Redis (for Chat application)
我正在嘗試為我的rails應用程序構建聊天功能。 我正在使用ActionController::Live
, Puma
, Resque
, Redis
。 所以基本上在這種情況下,redis subscribe
方法使用resque
在后台運行。 到目前為止,我所做的是每當用戶在下面的表單字段即聊天框中輸入文本時
<%= form_tag chat_box_publish_path, method: :get do %>
<%= text_field_tag :query, params[:query], class: "form-control", id: "chatSearchBox",
placeholder: 'Search' %>
<% end %>
..the請求即將Publish
在方法ChatBoxController
。
def publish
$redis.publish("chat_message:1:1", "#{params[:query]}")
respond_to do |format|
format.js {render nothing: true}
end
end
..現在我有一個以下背景Resque
作業運行與下面的代碼用於測試目的。 因此,每當發布聊天消息時,它打印的data
都很好。 但是,我如何將ActionController::Live
功能添加到后台作業? 或者我如何進行此實施? 需要幫助這個設計。
class ChatBoxInitiator
@queue = :chat_box_initiator
private
def self.perform
$redis.subscribe('chat_message:1:1') do |on|
on.message do |event, data|
puts "====#{data}"
return data
end
end
end
end
我想在Users/show
頁面中顯示Server Sent Events(SSE)
以及ActionController::Live
以獲取通知
在config/initializers
目錄中創建redis.rb
初始化程序文件, redis.rb
化redis
實例。 設置heartbeat
線程也是一個好主意(根據您的要求,任何從5秒到5分鍾都可以):
$redis = Redis.new
heartbeat_thread = Thread.new do
while true
$redis.publish("heartbeat","thump")
sleep 15.seconds
end
end
at_exit do
heartbeat_thread.kill
$redis.quit
end
您需要向ChatController
, pub
和sub
添加兩個方法。 pub
的作用是將聊天事件和消息發布到redis
,以及sub
來訂閱這些事件。 它應該看起來像這樣:
class ChatController < ApplicationController
include ActionController::Live
skip_before_filter :verify_authenticity_token
def index
end
def pub
$redis.publish 'chat_event', params[:chat_data].to_json
render json: {}, status: 200
end
def sub
response.headers["Content-Type"] = "text/event-stream"
redis = Redis.new
redis.subscribe(['chat_event', 'heartbeat']) do |on|
on.message do |event, data|
response.stream.write "event: #{event}\ndata: #{data}\n\n"
end
end
rescue IOError
logger.info "Stream Closed"
ensure
redis.quit
response.stream.close
end
end
在你的routes
,使酒館 POST
和SUB一個GET
和路徑匹配像/chat/publish
和/chat/subscribe
。
假設您的聊天應用程序的實際網頁位於/chat
,您需要編寫一些Javascript來實際發送和接收聊天消息。
為了便於理解,我們假設您的網頁只有一個文本框和一個按鈕。 點擊按鈕應該將文本框的內容發布到聊天流,我們可以使用AJAX來實現:
$('button#send').click (e) ->
e.preventDefault()
$.ajax '/chat/publish',
type: 'POST'
data:
chat_data: {
message: $("input#message").val()
timestamp: $.now()
error: (jqXHR, textStatus, errorThrown) ->
console.log "Failed: " + textStatus
success: (data, textStatus, jqXHR) ->
console.log "Success: " + textStatus
現在,您還需要能夠訂閱和接收聊天消息。 您需要使用EventSource
。 使用EventSource ,打開SSE的通道,以便您可以接收事件,並使用該數據更新視圖。 在此示例中,我們只將它們記錄到javascript控制台。
代碼看起來應該是這樣的:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
注意: 將上面的兩個代碼塊放在controllername.coffee
文件中,對於此示例,它應該是 app/assets/javascript
目錄中的chat.js.coffee
。 您還需要確保將其加載到資產管道中。 在你的application.js
文件中require
它(如果你還沒有調用require tree .
)。
在開發環境中,您必須通過將以下兩行添加到config/environments/development.rb
來啟用並行請求:
config.preload_frameworks = true
config.allow_concurrency = true
現在啟動瀏覽器,瀏覽/chat
並查看魔法。 鍵入消息並單擊按鈕時,該網頁的所有實例都將收到該消息。
這就是你使用ActionController::Live
和Redis
在rails
創建基本聊天應用程序的方法。 根據您的要求,最終的代碼顯然會有很大不同,但這應該可以幫助您入門。
您應該查看更多資源:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.