让Action Cable在Sidekiq工作中进行广播

17

我在docker环境下使用Rails 5,使用worker.new.perform可以完美地将Action Cable广播到Sidekiq工人,但是我无论如何都无法在使用worker.perform_async时进行广播。

这是我的cable.yml:

default: &default
 adapter: redis
 url: <%= ENV['REDIS_PROVIDER'] %>

development:
 <<: *default

test:
  <<: *default

production:
  <<: *default

这是我的工作人员:

class AdminWorker
  include Sidekiq::Worker

  def perform
    ActionCable.server.broadcast 'admin_channel', content: 'hello'
  end
 end

我的管理频道:

class AdminChannel < ApplicationCable::Channel
 def subscribed
  stream_from "admin_channel"
 end

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

就如我之前所提到的那样,当调用AdminWorker.new.perform时一切正常。但是一旦我尝试运行AdminWorker.perform_async,电缆将不会广播,日志中也没有关于Action Cable方面有用的信息。我在这里漏掉了什么?


我也遇到了同样的问题。你找到任何解决方案了吗? - Rails Developer
3个回答

31

我也遇到了同样的问题,看到了这个回答:ActionCable.server.broadcast from the console——对我有用。基本上只需更改cable.yml文件。

development:
  adapter: async

development:
  adapter: redis
  url: redis://localhost:6379/1

我可以从控制台、模型、Sidekiq worker 类等位置进行广播。


谢谢,这正是我的问题所在,我无法使我的工作人员广播和同步我的视图,而这解决了问题,特别是提供的链接。 - d1jhoni1b

1

我的ActionCable服务器是独立运行的。你还能从控制台广播吗? - Trip

0

在开发环境中 默认情况下,ActionCable 只会在 Rails 服务器上运行。它不会在 Sidekiq、控制台、cron 作业等中工作。 因为config/cable.yml 中,开发服务器适配器被设置为异步。

解决方案: 对于 ActionCable 进程间广播,您必须将适配器设置为 Redis。

config/cable.yml

development:
 adapter: redis
 url: redis://localhost:6379/1
 channel_prefix: project_name_development

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接