web-dev-qa-db-ja.com

(コンソールではなく)アプリから呼び出されたときに、HerokuのSidekiqでジョブをキューに入れるためにActiveJobを取得するにはどうすればよいですか?

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
23
Jason Preston

恥ずかしく、すべてが正常に機能していることがわかり、コードを介してメール配信をテストするために行っていたアクションは、ユーザー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

86
Jason Preston