【问题标题】:Implementing notification/alert popup on job completion in Ruby on Rails在 Ruby on Rails 中实现作业完成时的通知/警报弹出窗口
【发布时间】: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


【解决方案1】:

Rails 4 引入了ActionController::Live 模块。这允许将SSEs 推送到浏览器。如果你想基于数据库更新来实现这个,你需要考虑将 Postgresql 配置为LISTEN and NOTIFY

class MyController < ActionController::Base
  include ActionController::Live

  def stream
    response.headers['Content-Type'] = 'text/event-stream'
    100.times {
      response.stream.write "hello world\n"
      sleep 1
    }
  ensure
    response.stream.close
  end
end

这里有一篇很好的文章:http://ngauthier.com/2013/02/rails-4-sse-notify-listen.html

【讨论】:

  • 感谢您的建议。但是我可以在使用“Faye”处理完成后使用服务器端客户端推送消息来完成推送通知。
  • 我对 SES 的理解(这可能是完全错误的)是,当使用 Rails SES 时,可能会遇到线程问题,具体取决于所使用的网络服务器,因为它目前正在实施。
【解决方案2】:

感谢 fmendez。

我查看了其他用户给出的建议,最后,我实现了一个基于“Faye”的推送通知:

  1. 为成功登录的用户订阅使用“user_id”创建的频道
  2. 作业完成后从服务器端回复此频道(通过获取 user_id)

为了更好地理解(以便对其他人有所帮助),请检查问题的编辑。

【讨论】:

    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多