动作电缆广播消息fron sidekiq仅在刷新后显示,可从控制台立即工作

时间:2019-06-05 19:19:26

标签: ruby-on-rails sidekiq actioncable

我跟随this tutorial制作了动作有线广播,但效果并不理想。频道流和Web应用程序已成功预订,但从sidekiq后台作业广播的消息仅在刷新页面后显示在控制台上使用相同的命令确实会导致页面的立即更新

在chrome的开发人员模式下查看框架时,我看不到来自后台作业的广播消息,但可以立即看到控制台发送的消息。但是,我可以确认sidekiq后台作业正在将这些消息广播到某个地方,因为它们确实会在刷新时显示。但是,我不知道他们在哪里排队。

是否需要进行其他配置更改,以防止来自后台作业的消息排队到某个地方?我的代码中是否有任何拼写错误或错误可能导致这种情况?

动作有线广播消息:

ActionCable.server.broadcast "worker_channel", {html:
      "<div class='alert alert-success alert-block text-center'>
        Market data retrieval complete.
    </div>"
    }

smart_worker.rb:-从控制器的动作中称为Perform_async

class SmartWorker
  include Sidekiq::Worker
  include ApplicationHelper
  sidekiq_options retry: false

 def perform
   ActionCable.server.broadcast "worker_channel", {html:
      "<div class='alert alert-success alert-block text-center'>
        Market data retrieval complete.
    </div>"
    }
 end

connection.rb:

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = current_user #find_verified_user ignored until method implemented correctly and does not always return unauthorized
    end

    private 

    def find_verified_user
      if current_user = User.find_by(id: cookies.signed[:user_id]) 
        current_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

worker_channel:

class WorkerChannel < ApplicationCable::Channel
  def subscribed
    stream_from "worker_channel"
  end 

  def unsubscribed
  end
end

worker.js:

App.notifications = App.cable.subscriptions.create('WorkerChannel', {
  connected: function() {
    console.log('message connected');
  },
  disconnected: function() {},
  received: function(data) {
    console.log('message recieved');
    $('#notifications').html(data.html);
  }
});

cable.yml

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

test:
  adapter: async

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

也已添加

可以看到,但这没什么区别。

2 个答案:

答案 0 :(得分:0)

ActionChannel通常不会将消息排队,没有订阅者时广播的消息应该丢失。如果通知确实比您预期的晚到,则可能会发生可观察到的行为。

我要检查:

  1. 在控制台中运行整个作业,而不仅仅是通知,并查看运行是否缓慢
  2. 检查sidekiq队列延迟
  3. 在作业中的通知之前/之后添加日志记录,并检查作业是否实际成功运行的日志

答案 1 :(得分:0)

我不确定这是否是完整的解释,但这是我通过进一步测试观察到的结果:

多个服务器重新启动后,广播开始工作,并将按预期记录在开发记录器中。控制台消息仍然命中或未命中,因此我在广播的消息中添加了一些其他标识符,并确定它们在下一页的加载完成之前正在广播。这导致两件事: 1)快速播放由广播触发的Flash消息(在被认为是旧页面的状态下-即仅在刷新后才能工作) 2)浏览器控制台中缺少或不一致的行为:由于sidekiq worker作业完成得如此之快,有时甚至在浏览器开始呈现新页面之前,我相信控制台消息会被页面加载操作重置,因此不会当您查看日志时(或凝视了一段时间)可见。

这似乎像预期的那样工作,并且只是在本地环境中快速工作,这使得它似乎似乎没有按预期工作。