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?