ruby on rails - ¿Cómo puedo obtener ActiveJob para poner en cola trabajos en Sidekiq en Heroku cuando se los llama desde la aplicación(no desde la consola)?
ruby-on-rails ruby-on-rails-4.2 (1)
Estoy corriendo Rails 4.2 en Heroku (cedro), Ruby 2.1.6
Tengo Sidekiq ejecutándose localmente en Redis con Foreman, y en mi aplicación llamo los nuevos métodos ActiveJob deliver_later de Rails como este, dentro de application_helper.rb
:
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
A nivel local, esto funciona según lo previsto. Los correos electrónicos se muestran en la cola de "correos" y luego se procesan y se entregan usando sendgrid.
En la heroku run rails console
puedo activarlo manualmente, y funciona bien:
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">
pero si simplemente completo acciones en mi aplicación, como lo haría como usuario, nunca se entrega nada a la cola ... Estoy totalmente sin ideas. Estoy ejecutando un proceso de trabajo. Estoy conectado al servidor de redis cloud. Puedo ver el panel de la web de sidekiq.
¿Qué no estoy poniendo? Feliz de proporcionar otros registros / información, pero no estoy seguro de qué más proporcionar.
Mi consola simplemente informa de la acción:
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
Avergonzado , resulta que todo funciona correctamente, y la acción que estaba realizando para probar la entrega de correo electrónico a través del código nunca habría enviado un correo electrónico, porque el usuario con el que lo estaba probando tiene las notificaciones de correo electrónico desactivadas en la configuración.
Suspiro.
Pero para la posteridad y para aquellos que están tratando de hacer que Sidekiq trabaje en Heroku con Rails 4.2 y Redis Cloud, aquí hay algunos escollos que encontré: la parte que me llevó más tiempo para descubrirlo fue para que Sidekiq encontrara En su servidor Redis, deberá configurar la variable ENV EN Heroku (no en su código). Entonces, en la consola, primero agregue, por ejemplo, rediscloud:
heroku addons:create rediscloud
Y luego necesitas agregar la URL como una variable de entorno:
heroku config:set REDIS_PROVIDER=REDISCLOUD_URL
La documentación de Sidekiq es muy útil. Utilicé brew install redis
para instalar Redis localmente, luego redis-server
para ejecutar el servidor en una ventana de terminal localmente. Se agregó la gem ''sidekiq''
al Gemfile y todo funcionó muy bien en el desarrollo.
Si agrega rutas como se muestra aquí , podrá monitorear la cola en su navegador web.
Por último, no olvide que debe agregar un trabajador en su Procfile
AND escalar hasta un trabajador en Heroku usando heroku ps:scale worker=1
- no comenzará solo porque está en su Procfile.
También: cuando ponga Sidekiq en su Procfile, asegúrese de decirle que procese la cola de correos, por ejemplo
worker: bundle exec sidekiq -q default -q mailers