2016-05-23 42 views
2

我現在熟悉Action Cable(Rails 5功能)作爲websockets的發射器或服務器。不過,我應該使用一個通過websockets發送數據的API(例如'socket.provider.com?token=12345')。Rails 5應用程序(動作電纜)作爲Socket.io服務器和客戶端

我使用socket.io-client-simple(https://github.com/shokai/ruby-socket.io-client-simple)對一個普通的Ruby文件進行了一些測試,它可以工作,但我不確定這將如何在部署的Rails應用程序上工作。我猜我需要一個獨立的進程,不斷監聽API提供者發出的事件。有沒有人做過類似的事情?我將使用Heroku進行部署。

注意:我認爲使用客戶端方法接收websockets並將它們發佈到我的Rails應用程序(即Javascript Socket.IO庫)不是一種選擇,因爲我需要接收AND並保留一些數據來自事件的實時而不依賴於至少一個客戶端的連接。

我還想知道是否有任何方法可以自動設置Action Cable作爲「事件監聽者」。到目前爲止還沒有閱讀過關於這個話題的任何內容,但很想看到關於這個方向的一些建議。

更新:這是我使用至今連接到供應商的WebSockets API的Ruby代碼:

require 'rubygems' 
require 'socket.io-client-simple' 

socket = SocketIO::Client::Simple.connect 'https://api.provider.com', token: '12345' 

socket.on :connect do 
    puts "connect!!!" 
end 

socket.on :disconnect do 
    puts "disconnected!!" 
end 

socket.on :providerevent do |data| 
    puts data 
end 

socket.on :error do |err| 
    p err 
end 

puts "please input and press Enter key" 
loop do 
    sleep 100 
end 

回答

3

ActionCable不能收聽到外部網站在自己的事件,所以你」必須結合socket.io和ActionCable。

ActionCable可以將更新發送到信道是這樣的:

ActionCable.server.broadcast "channel_name", param1: your_param1, param2: your_param2

當一個事件發生時更新的通道。您頻道的coffeescript文件的動作是您必須對其進行操作的地方。 據我所知,你在控制器中尋找這樣的事情,你會被監聽事件:

def listen 
    socket.on :connect do 
    # persist your data 
    # example: @post = Post.create(...) 
    ActionCable.server.broadcast "channel_name", post_title: @post.title 
    end 
end 

,並在您channel_name.coffee:

received: (data) -> 
    console.log(data["post_title"]) 
    # do something 

採用這種設置,你會從api接收事件,並將它傳播到你的頻道。該頁面是渠道設置將更新每次您的套接字接收事件。

你應該首先遵循DDH的教程,然後你可能會更好地理解我的解決方案(這很容易實現)。

+0

嗨Graham,謝謝你的鏈接。我知道如何在生產中使用ActionCable。我的問題是如何從我的Rails應用程序主動偵聽來自外部提供程序的套接字事件**。這意味着,我的應用程序不僅會發出從我的應用程序本身生成的事件,還會接收由外部API生成的事件。 –

+0

外部api是否向您的應用中的端點發送請求/事件? –

+0

不,我必須通過連接到它們的端點來監聽它們(例如,通過Socket.IO連接到'socket.provider.com?token=12345')。這在我寫的測試普通Ruby程序中工作,正如我在我的問題中所述,但我想要的是知道如何使活動後臺進程始終連接到此提供程序的Websockets API。 –

相關問題