我跟随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
也已添加
可以看到,但这没什么区别。
答案 0 :(得分:0)
ActionChannel通常不会将消息排队,没有订阅者时广播的消息应该丢失。如果通知确实比您预期的晚到,则可能会发生可观察到的行为。
我要检查:
答案 1 :(得分:0)
我不确定这是否是完整的解释,但这是我通过进一步测试观察到的结果:
多个服务器重新启动后,广播开始工作,并将按预期记录在开发记录器中。控制台消息仍然命中或未命中,因此我在广播的消息中添加了一些其他标识符,并确定它们在下一页的加载完成之前正在广播。这导致两件事: 1)快速播放由广播触发的Flash消息(在被认为是旧页面的状态下-即仅在刷新后才能工作) 2)浏览器控制台中缺少或不一致的行为:由于sidekiq worker作业完成得如此之快,有时甚至在浏览器开始呈现新页面之前,我相信控制台消息会被页面加载操作重置,因此不会当您查看日志时(或凝视了一段时间)可见。
这似乎像预期的那样工作,并且只是在本地环境中快速工作,这使得它似乎似乎没有按预期工作。