ruby-on-rails - 当从应用程序(而不是控制台)调用时,如何让 ActiveJob 在 Heroku 上的 Sidekiq 中排队作业?

标签 ruby-on-rails heroku sidekiq ruby-on-rails-4.2

我在 Heroku(雪松)、Ruby 2.1.6 上运行 Rails 4.2

我已经使用 Foreman 在 Redis 上本地运行 Sidekiq,在我的应用程序中,我在 application_helper.rb 中调用 Rails 的新 ActiveJob delivery_later 方法,如下所示:

assigning_user = User.find(object.created_by)
completing_user = User.find(object.completed_by)
if NotificationMailer.assigned_user_completed_todo(object, completing_user, assigning_user).deliver_later
  nn.email_status = "sent"
end

在本地,这按预期工作。邮件出现在“邮件程序”队列中,然后使用 sendgrid 进行处理和传送。

heroku run rails console我可以手动触发它,它工作得很好:
Loading production environment (Rails 4.2.1)
irb(main):001:0> a = Account.first
Account Load (1.5ms)  SELECT  "accounts".* FROM "accounts"  ORDER BY     "accounts"."id" ASC LIMIT 1
=> #<Account id: 1, name: "The Prestons", stripe_customer_id: nil, active_until: "2015-06-27 14:50:43", plan: nil, created_at: "2015-04-27 14:50:43", updated_at: "2015-04-27 14:50:43">
irb(main):002:0> NotificationMailer.new_account_created(a).deliver_later
Enqueued ActionMailer::DeliveryJob (Job ID: 7c0ddf9c-6892-4aa9-823e-9954b2a4e642) to Sidekiq(mailers) with arguments: "NotificationMailer", "new_account_created", "deliver_now", gid://raisin/Account/1
=> #<ActionMailer::DeliveryJob:0x007f4d9ed9da58 @arguments=["NotificationMailer", "new_account_created", "deliver_now", #<Account id: 1, name: "The Prestons", stripe_customer_id: nil, active_until: "2015-06-27 14:50:43", plan: nil, created_at: "2015-04-27 14:50:43", updated_at: "2015-04-27 14:50:43">], @job_id="7c0ddf9c-6892-4aa9-823e-9954b2a4e642", @queue_name="mailers">

但是如果我只是在我的应用程序中完成操作,就像我作为用户所做的那样,没有任何东西被传递到队列中......我完全没有想法。我正在运行一个工作进程。我连接到redis云服务器。我可以看到 sidekiq 网络仪表板。

我没有设置什么?很高兴提供其他日志/信息,但不确定还提供什么。

我的控制台只报告操作:
2015-05-14T09:14:37.674095+00:00 heroku[router]: at=info method=POST path="/accounts/1/projects/15/lists/33/items/112" host=www.myapp.com request_id=516db810-8a2c-4fd0-af89-29a59783b0a8 fwd="76.104.193.78" dyno=web.1 connect=1ms service=111ms status=200 bytes=2039

最佳答案

尴尬 ,事实证明一切正常,我通过代码测试电子邮件传递的操作永远不会发送电子邮件,因为我正在测试它的用户有 电子邮件通知已关闭 在设置中。

叹。

但是对于后代以及那些试图让 Sidekiq 使用 Rails 4.2 和 Redis Cloud 在 Heroku 上工作的人,这里有一些我遇到的陷阱: 我花了最多时间弄清楚的部分是为了让 Sidekiq 找到您的 Redis 服务器,您需要在 Heroku 中设置 ENV 变量(不在您的代码中)。因此,在控制台中,首先添加例如云:
heroku addons:create rediscloud
然后您需要将 URL 添加为环境变量:
heroku config:set REDIS_PROVIDER=REDISCLOUD_URL
Sidekiq 文档非常有用。我用过 brew install redis本地安装Redis,然后redis-server在本地终端窗口中运行服务器。已添加 gem 'sidekiq'到 Gemfile,一切都在开发中运行良好。

如果添加路由 as shown here ,您将能够在 Web 浏览器中监控队列。

最后,不要忘记您需要在 Procfile 中添加一个 worker 。并使用 heroku ps:scale worker=1 在 Heroku 中扩展到一名 worker -- 它不会仅仅因为它在您的 Procfile 中而启动。

另外:当你把 Sidekiq 放在你的 Procfile 中时,一定要告诉它处理邮件队列,例如
worker: bundle exec sidekiq -q default -q mailers

关于ruby-on-rails - 当从应用程序(而不是控制台)调用时,如何让 ActiveJob 在 Heroku 上的 Sidekiq 中排队作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30233977/

相关文章:

ruby-on-rails - npm 错误 : tunneling socket could not be established, 原因=连接 ETIMEDOUT

node.js - 使用 OpenCV 的 Heroku NodeJS 应用

ruby-on-rails - 无法将本地主机连接到 heroku 数据库

ruby-on-rails - 在 Ruby on Rails 中生成多对多模型

ruby-on-rails - 在 Gitlab CI 上将 Redis 用于 Rails 项目

sql - 对多个父记录的子项属性进行 SUM 运算

ruby-on-rails - 数据库迁移到 heroku 不起作用

ruby-on-rails - sidekiq 停止时,由 sidekiq 生成的进程也会停止

ruby-on-rails - 如果 Sidekiq 未处于运行状态,则自动启动它 - Rails

ruby-on-rails - Sidekiq 不排队作业