Rails actioncable 奇怪的问题

xiaoxiao · 2020年05月28日 · 最后由 xiaoxiao 回复于 2020年05月28日 · 3014 次阅读

我使用 crono 定时执行 job 任务,job 任务就是更新 camera 某个值

class ScanerJob < ApplicationJob
  queue_as :default
  def perform()
      Camera.first.update_attributes(:name=>Time.now.to_i)
  end
end

camera 这个类有回调,向所有的连接发送更新通知

class Camera < ApplicationRecord
  after_save :update_notify
  def update_notify
    puts "notify"
    ActionCable.server.broadcast "conversation_channel", cmd: "refresh_camera"
  end
end

我执行 crono 之后浏览器都无法收到消息,我换了另一种方式浏览器就能收到消息了,在 controller 里面定义一个 action,然后请求这个 url 执行 Camera 类更新

def publish
    Camera.first.update_attributes(:name=>Time.now.to_i)
end

然后我又换了在 console.log 里面执行,也是没法发送消息,效果跟在 job 中执行一样。

$ rails c
Running via Spring preloader in process 5110
Loading development environment (Rails 5.1.7)
2.4.0 :001 > Camera.first.update_attributes(:name=>Time.now.to_i)
   (0.3ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  Camera Load (0.2ms)  SELECT  `cameras`.* FROM `cameras` ORDER BY `cameras`.`id` ASC LIMIT 1
   (0.2ms)  BEGIN
  SQL (0.3ms)  UPDATE `cameras` SET `name` = '1590657294', `updated_at` = '2020-05-28 09:14:54' WHERE `cameras`.`id` = 1
notify
[ActionCable] Broadcasting to conversation_channel: {:cmd=>"refresh_camera"}
   (2.5ms)  COMMIT
 => true 

这也是醉了,感觉没有载入 actioncable 这个环境,请求 url 这种方式就载入了 actioncable 的环境,各位大神请指教,这是什么 bug,如何解决

channel 名是否一样,看上面一个 conversation_channel 一个 conversation_1_channel

是在本地开发环境吗? 默认情况下用的 async 模式, 不能跨进程. 可以改为 redis 模式.

Rei 回复

日志打印错了

lyfi2003 回复

😀 厉害了,确实是这样,我改成了 redis 模式,就可以收到了

xiaoxiao 关闭了讨论 05月28日 18:32
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册