Heroku(cedar)でRails 4.2、Ruby 2.1.6を実行しています
Forismanを使用してRedisでSidekiqをローカルで実行し、アプリでapplication_helper.rb
内でRailsの新しいActiveJob deliver_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 Webダッシュボードが表示されます。
何を設定していないのですか?他のログ/情報を喜んで提供しますが、他に何を提供すべきかわからない.
私のコンソールは単にアクションを報告します:
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
恥ずかしく、すべてが正常に機能していることがわかり、コードを介してメール配信をテストするために行っていたアクションは、ユーザーIが設定でメール通知をオフにしてテストしていました。
はぁ。
しかし、後世のために、Rails 4.2とRedis CloudでSidekiqをHerokuで動作させようとしている人たちのために、私が遭遇したいくつかの落とし穴を以下に示します。 SidekiqでRedisサーバーを見つけるには、ENV変数を(コードではなく)INに設定する必要があるため、コンソールで、たとえばrediscloudを最初に追加します。
heroku addons:create rediscloud
次に、環境変数としてURLを追加する必要があります。
heroku config:set REDIS_PROVIDER=REDISCLOUD_URL
Sidekiqのドキュメントは非常に役立ちます。 brew install redis
を使用してRedisをローカルにインストールしてから、redis-server
を使用してターミナルウィンドウでローカルにサーバーを実行しました。 gem 'sidekiq'
をGemfileに追加し、開発ですべてがうまく機能しました。
ルートを追加する場合 ここに示すように 、Webブラウザでキューを監視できます。
最後に、Procfile
にワーカーを追加し、heroku ps:scale worker=1
を使用してHerokuのワーカーを1つ増やす必要があることを忘れないでください。Procfileにあるからといって起動しません。
また、SidekiqをProcfileに入れるときは、メーラーキューを処理するように必ず伝えてください。
worker: bundle exec sidekiq -q default -q mailers