workers rails perform now job generate delayed_job_active_record active ruby-on-rails ruby-on-rails-3 heroku devise

ruby-on-rails - rails - sidekiq perform now



Rails+Devise+delayed_job? (9)

De Robert May: https://gist.github.com/659514

Agregue esto a un archivo en el directorio config/initializers :

module Devise module Models module Confirmable handle_asynchronously :send_confirmation_instructions end module Recoverable handle_asynchronously :send_reset_password_instructions end module Lockable handle_asynchronously :send_unlock_instructions end end end

Tengo una aplicación Rails 3 utilizando Devise en Heroku. El problema es que estoy enviando correos electrónicos con Sendgrid y la entrega del correo electrónico es lenta, hace que la aplicación se cuelgue. Así que estoy interesado en usar delayed_job para poner en cola la entrega del correo electrónico en segundo plano para que mi aplicación responda al usuario.

¿Cómo se puede usar Devise con delayed_job? ¿Alguna forma de configurar Devise para usar delayed_job?



En general, he encontrado que es mejor evitar cualquier y todos los administradores de tareas de segundo plano disponibles para Ruby y Rails, punto. Ellos chupan

En su lugar, uso crontab, que es un programa antiguo y muy bueno en su trabajo. Solo haga un guión para hacer su trabajo sucio de vez en cuando y dígale a crontab que lo ejecute en el momento adecuado usando los rieles de corredores. Esto mantiene esas molestas tareas de ejecución prolongada fuera del tiempo de ejecución del resto de su aplicación Rails, pero aún tiene acceso a la base de datos y toda la pila de Rails si lo desea / lo necesita.


Encontré que nada de lo anterior funcionó para mí. Estoy usando Devise 2.0.4 y Rails 3.2.2 con delayed_job_active_record 0.3.2

La forma en que el dispositivo realmente habla sobre hacer algo como esto en los comentarios en el código es anular los métodos en la clase Usuario. Así, lo resolví así, y funciona perfectamente:

app / models / User.rb

def send_on_create_confirmation_instructions Devise::Mailer.delay.confirmation_instructions(self) end def send_reset_password_instructions Devise::Mailer.delay.reset_password_instructions(self) end def send_unlock_instructions Devise::Mailer.delay.unlock_instructions(self) end


Esto es lo que me funcionó:

en app / models / user.rb

# after your devise declarations handle_asynchronously :send_reset_password_instructions handle_asynchronously :send_confirmation_instructions handle_asynchronously :send_on_create_confirmation_instructions

Es posible que no los necesite todos, según los módulos de diseño que esté incluyendo.


No estoy seguro de por qué necesita autenticar alguna de las tareas delayed_job. Simplemente haga que las acciones del controlador autenticadas de Devise pongan en cola la entrega del correo electrónico a un método de biblioteca.


No estoy seguro de que Devise proporcione una manera fácil de hacer un fondo de la entrega del correo electrónico. Sin embargo, hay formas de poder hacerlo con DelayedJoy. DelyedJob proporciona una función "handle_asynchronically" que si se inyecta en DeviseMailer puede garantizar que las entregas se realicen en segundo plano.

Prueba esto en tu config / application.rb

config.after_initialize do ::DeviseMailer.handle_asynchronously :deliver_confirmation_instructions # or ::DeviseMailer.handle_asynchronously :deliver! end

Tendrás que experimentar con eso. También puede intentar heredar el DeviseMailer y configurarlo para que se distribuya de forma asíncrona en un inicializador en config / initializer / devise_mailer_setup.rb o algo parecido.


Para delayed_job_active_record con Devise , solo use lo siguiente. (agregarlo al user.rb model )

handle_asynchronously :send_devise_notification, :queue => ''devise''


Utilizo el complemento delayed_job_mailer para lograr esto en las aplicaciones de Rails 2. No estoy seguro si funciona con Rails 3.