在 Rails 中广播消息时未调用 ActionCable 频道

Posted

技术标签:

【中文标题】在 Rails 中广播消息时未调用 ActionCable 频道【英文标题】:ActionCable channel not getting called on broadcasting message in rails 【发布时间】:2020-10-08 11:21:32 【问题描述】:

首先,ActionCable 功能非常新。我一直在关注这里的教程:https://www.driftingruby.com/episodes/push-notifications-with-actioncable

创建了一个名为 web_notifications_channel 和 web_notifications_channel.rb 的频道:

class WebNotificationsChannel < ApplicationCable::Channel
  def subscribed
    stream_from "web_notifications_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end

web_notifications_channel.js:

import consumer from "./consumer"

consumer.subscriptions.create("WebNotificationsChannel", 
  connected() 
    // Called when the subscription is ready for use on the server
  ,

  disconnected() 
    // Called when the subscription has been terminated by the server
  ,

  received(data) 
    // Called when there's incoming data on the websocket for this channel
    console.log(`wtf`)
    
  
);

控制台中没有显示任何内容。

将 cable.yml 中的适配器设置更改为 redis 以便从控制台请求:

development:
  adapter: redis

test:
  adapter: test

production:
  adapter: redis
  url: <%= ENV.fetch("REDIS_URL")  "redis://localhost:6379/1"  %>
  channel_prefix: community_rails_production

运行控制台命令:

ActionCable.server.broadcast 'web_notifications_channel', 'You have visited the welcome page.'

我得到的回应是:

Broadcasting to web_notifications_channel: "You have visited the welcome page."
 => 0 

但是我的received 方法永远不会被调用!!我在这里疯了,因为无法理解发生了什么!我检查了一些类似的问题,但没有一个对我有帮助。

PS:我已经为 redis 添加了 gem,并从我的控制台启动了 redis。

【问题讨论】:

哈哈,我也遇到了同样的问题。我仍然不确定它是否 100% 工作。 ActionCable 及其实施存在问题。从升级到 rails 6 开始,尝试记录 redis 的控制台(看看它是否保存在那里)并祈祷它会工作:-p 我正在实现一个功能,太多了,无法处理这个 sh**。 @RocKhalil。我的 rails 已经是 6 了,但是在 redis 控制台登录什么 我知道的!我花了 2-3 天的时间才知道这是 rails 5.2 的问题;升级到 rails 6 看看是否解决了;它起作用了,有时它只是由于某种原因没有传播!我正在考虑切换到 socket.io 和节点服务器而不是 ActionCable 我什至没有默认生成的redis日志文件 您是否尝试过将 console.log 语句放在 js 文件中的 connecteddisconnected 方法中,看看它们是否被执行?如果它们没有显示,这可能意味着您没有在 application.js 文件中包含频道文件(或类似文件,具体取决于您的设置)。 【参考方案1】:

您滥用了创建 API

consumer.subscriptions.create( channel: "WebNotificationsChannel" , 
  connected() 
    // Called when the subscription is ready for use on the server
  ,

  disconnected() 
    // Called when the subscription has been terminated by the server
  ,

  received(data) 
    // Called when there's incoming data on the websocket for this channel
    console.log(`wtf`)
    
  
);

您也可以在您的开发工具的Network 标签中检查连接,通过WS 过滤以查看连接是否创建成功。

rails 服务器或action cable 服务器(如果您将action cable 配置为作为独立服务器运行)也有日志告诉您连接是成功还是失败,并带有详细信息错误,如果有的话。

【讨论】:

以上是关于在 Rails 中广播消息时未调用 ActionCable 频道的主要内容,如果未能解决你的问题,请参考以下文章

如何在自组织网络中广播?

如何在 PySpark 中广播 RDD?

防止在 Pandas 中广播 [重复]

在Flink中广播HashMap

Android中广播的发送BroadcastReceiver

如何在pyspark中广播一个巨大的rdd?