2016-05-24 7 views
5

snlamm und ich habe ein Problem mit der Implementierung mehrerer Web-Socket-Kanäle in unserer Rails App. Der Fehler ist, dass der Server nach der folgenden Antwort einfriert:Rails 5 ActionCable Problem beim Ausführen mehrerer Kanäle für einen Web-Socket

Started GET "/cable" for ::1 at 2016-05-24 11:42:16 -0400 
Started GET "/cable/" [WebSocket] for ::1 at 2016-05-24 11:42:16 -0400 
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) 

Hinweis: Unsere Browser-Konsole löst keine Fehler aus. Wir verwenden Chrome v 50.0 (neueste Version).

jedoch auf einem inkonsistenten Basis, wenn wir starten unseren beiden Browser und Server erhalten wir:

Started GET "/cable" for ::1 at 2016-05-24 11:45:54 -0400 
Started GET "/cable/" [WebSocket] for ::1 at 2016-05-24 11:45:54 -0400 
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket) 
ItemsChannel is transmitting the subscription confirmation 
ItemsChannel is streaming from items 
MessagesChannel is transmitting the subscription confirmation 
MessagesChannel is streaming from messages 

und alles funktioniert.

Wie erwähnt, ist dieses Update inkonsistent und häufiger blockiert unser Server. Wir haben festgestellt, dass es keine Probleme gibt, wenn nur ein Kanal läuft.

Hier ist unser Code für den Artikel-Kanal, der einer der zwei Kanäle ist, die wir hinzugefügt haben. Der Code für beide Kanäle sind nahezu identisch:

Route

mount ActionCable.server => '/cable' 

Kanäle/application_cable/channel.rb

module ApplicationCable 
    class Channel < ActionCable::Channel::Base 
    end 
end 

Kanäle/application_cable/connection.rb

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    end 
end 

Kanäle/items_channel.rb

class ItemsChannel < ApplicationCable::Channel 
    def subscribed 
    stream_from 'items' 
    end 
end 

views/Bestellungen/show.html.erb

Dies ist unserer Ansicht nach für den Kanal zeigt ein Element angebracht.

<div id="item-list"> 
     <h2>Items: <% @order.items.each do |item| %></h2> 
     <li><%= item.name %> - $<%= item.cost %></li> 
     <% end %> 
    </div> 
    </ol> 
    <div id="item-errors"> 
    </div> 
    <br> 
    <h3>Time until ordered: <%= ((@order.expiration - @order.date_ordered)/60).round %> minutes</h3></div> 

    <%= form_for @item, remote: true do |f| %> 
    <%= f.hidden_field :order_id, value: @order.id, id: "order-id" %> 
    <span id='item-content-reset'> 
    Item name: <%= f.text_field :name, id: 'item-name' %> 
    Cost: <%= f.text_field :cost, id: 'item-cost' %> 
    </span> 
    <%= f.submit "Add Item", :id => 'item-create-btn' %> 
    <% end %> 
</div> 

Controller/items_controller.rb

class ItemsController < ApplicationController 
    def create 
    @item = Item.new(item_params) 
    @item.user = @current_user 
    if @item.save 
     ActionCable.server.broadcast 'items', 
     name: @item.name, 
     cost: @item.cost 
     head :ok 
    else 
     error_message = @item.errors.messages 
     render partial: 'shared/errors', locals: { errors: flash.now[:alert] = "Item " + error_message[:name][0] } 
    end 
    end 

    private 

    def item_params 
    params.require(:item).permit(:order_id, :cost, :name) 
    end 
end 

Vermögen/application.js

//= require jquery 
//= require bootstrap-sprockets 
//= require jquery_ujs 
//= require bootstrap-switch 
// require jquery.session 
// require turbolinks 
//= require_tree . 

Vermögen/javascripts/Kanäle/chatrooms.js

assets/Javascripts/Kanäle/items.js

App.items = App.cable.subscriptions.create('ItemsChannel', { 
    received: function(data) { 
    return $("#item-list").append(this.renderItem(data)); 
    }, 
    renderItem: function(data) { 
    return "<li> " + data.name + " - " + "$" + data.cost + "</li>"; 
    } 
}); 

Nach den Server wir ps aux Endung | grep für rails, ruby, puma, redis und sie hatten alle erfolgreich geschlossen (d. h. es gab keine Zombie-Prozesse). Was könnte dazu führen, dass der Server einfriert?

Antwort

Verwandte Themen