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?
De acuerdo con la página wiki de Devise , la gema de devise-async se encargará de esto por usted. Es compatible con delayed_job, resque y sidekiq.
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.