簡體   English   中英

如何使用ActionController :: Live以及Resque + Redis(用於聊天應用程序)

[英]How to use ActionController::Live along with Resque + Redis (for Chat application)

我正在嘗試為我的rails應用程序構建聊天功能。 我正在使用ActionController::LivePumaResqueRedis 所以基本上在這種情況下,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以獲取通知

預REQS:

  • Ruby 2.0.0+
  • Rails 4.0.0+
  • Redis的
  • 美洲獅

初始化:

config/initializers目錄中創建redis.rb初始化程序文件, redis.rbredis實例。 設置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

控制器:

您需要向ChatControllerpubsub添加兩個方法。 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 ,使酒館 POSTSUB一個GET和路徑匹配像/chat/publish/chat/subscribe


Coffeescript / Javascript:

假設您的聊天應用程序的實際網頁位於/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::LiveRedisrails創建基本聊天應用程序的方法。 根據您的要求,最終的代碼顯然會有很大不同,但這應該可以幫助您入門。

您應該查看更多資源:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM