Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets Rails 5 ActionCable存在为web套接字运行多个通道的问题_Sockets_Ruby On Rails 5_Actioncable - Fatal编程技术网

Sockets Rails 5 ActionCable存在为web套接字运行多个通道的问题

Sockets Rails 5 ActionCable存在为web套接字运行多个通道的问题,sockets,ruby-on-rails-5,actioncable,Sockets,Ruby On Rails 5,Actioncable,我在Rails应用程序中实现多个web套接字通道时遇到了一个问题。错误是服务器在以下响应后冻结: 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

我在Rails应用程序中实现多个web套接字通道时遇到了一个问题。错误是服务器在以下响应后冻结:

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)
注意:我们的浏览器控制台不会抛出错误。我们使用的是ChromeV50.0(最新版本)

但是,如果我们重新启动浏览器和服务器,我们会得到以下结果:

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
一切正常

如前所述,此修复不一致,而且我们的服务器经常会冻结。我们注意到,当我们只有一个频道在运行时,没有问题

这是我们添加的两个频道之一的items频道的代码。两个通道的代码几乎相同:

路线

mount ActionCable.server => '/cable'
channels/application\u cable/channel.rb

module ApplicationCable
  class Channel < ActionCable::Channel::Base
  end
end
module ApplicationCable
  class Connection < ActionCable::Connection::Base
  end
end
class ItemsChannel < ApplicationCable::Channel
  def subscribed
    stream_from 'items'
  end
end
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
assets/javascripts/channels/chatrooms.js

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

this.App = {};

App.cable = ActionCable.createConsumer("/cable");
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>";
  }
});
assets/javascripts/channels/items.js

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

this.App = {};

App.cable = ActionCable.createConsumer("/cable");
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>";
  }
});
App.items=App.cable.subscriptions.create('ItemsChannel'{
接收:功能(数据){
返回$(“#项列表”).append(this.renderItem(数据));
},
renderItem:函数(数据){
返回“
  • ”+data.name+”-“+”$“+data.cost+”
  • ”; } });

    结束服务器后,我们为rails、ruby、puma、redis安装了aux | grep,它们都已成功关闭(即没有僵尸进程)。什么可能导致服务器冻结?

    这听起来像是以下错误()。您可以在前面的链接中获取修补程序。如果您从事的是开发工作,您也可以尝试在development.rb中设置
    config.eager\u load=true
    ,这对我很有用