【发布时间】:2014-02-04 12:25:30
【问题描述】:
我正在使用'Sidekiq' gem 在 Rails 中实现后台处理作业,这些作业在用户单击按钮时运行。由于作业是异步运行的,rails 会立即回复。
我想添加一个功能或回调来触发 JavaScript 弹出窗口以显示作业处理已完成。
控制器片段:
def exec_job
JobWorker.perform_async(@job_id,@user_id)
respond_to do |wants|
wants.html { }
wants.js { render 'summary.js.haml' }
end
end
编辑 1: 我正在存储“user_id”以跟踪触发该作业的用户。这样我就可以将弹出窗口与该用户相关联。
编辑 2: Sidekiq 的 'perform' 方法会进行一些数据库操作(主要是更新)和日志创建,这需要时间。
目前,用户在稍后刷新页面时才知道状态。
编辑 3(解决方案尝试 1):
我尝试在用户成功登录后使用订阅来实现“Faye 推送通知”(频道为 user_id)。
在服务器端,当作业完成执行后,我创建了另一个客户端,将消息发布到同一频道(使用faye参考文档)。
它在我的桌面上运行良好,也就是说,我可以看到一个提示工作已完成的警报弹出窗口。但是当我尝试使用本地网络上的另一台机器进行测试时,不会提示警报。
客户端脚本:
(function() {
var faye = new Faye.Client('http://Server_IP:9292/faye');
var public_subscription = faye.subscribe("/users/#{current_user.id}", function(data) {
alert(data);
});
});
服务器端代码:
EM.run {
client = Faye::Client.new('http://localhost:9292/faye')
publication = client.publish("/users/#{user.id}", 'Execution completed!')
publication.callback do
logger.info("Message sent to channel '/users/#{user.id}'")
end
publication.errback do |error|
logger.info('There was a problem: ' + error.message)
end
}
【问题讨论】:
-
你想要做的概念是
Push Notifications。这个 Rails 演员剧集可能会对您有所帮助:railscasts.com/episodes/260-messaging-with-faye -
谢谢,我想我会尝试寻找“faye”解决方案。可能,我必须实现服务器端推送到频道。 :)
标签: javascript ruby-on-rails ruby callback sidekiq