A verdade é que, para quem utiliza Rails, existem vários plugins e gens que fazem este trabalho. Vejamos alguns:
Introducing Resque
background-fu
Backgroundjob
background_lite
backgroundrb
Porem, na minha opnião, a melhor opção é o Delayed Job. Com ele você armazena os jobs em uma tabela e os realiza quando achar melhor! Sem contar que o Delayed Job está disponível nas formas de plugin e gem. Vejamos o seu funcionamento:
Para instalar:
# instação como plugin # rode na raiz da aplicação script/plugin install git://github.com/collectiveidea/delayed_job.git
Configurando o banco de dados
Para gerar a tabela onde as tarefas serão salvas use os seguintes comandos no terminal:
script/generate delayed_job rake db:migrateIsso vai gerar uma tabela no seguintes moldes:
create_table :delayed_jobs, :force => true do |table| table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually. table.text :handler # YAML-encoded string of the object that will do work table.text :last_error # reason for last failure (See Note below) table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. table.datetime :locked_at # Set when a client is working on this object table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) table.string :locked_by # Who is working on this object (if locked) table.timestamps end
Realizando tarefas em background
Agora já é possível realizar jobs em background, veja um exemplo de envio de e-mail:
# usando o Delayed Job MeuModelDeEmail.send_later :deliver_MeuEmail, @MeuParametro # sem usar o Delayed Job: MeuModelDeEmail.deliver_MeuEmail(@MeuParametro)
Outro exemplo:
@imagem.calculate_size # sem usar o Delayed Job
@imagem.send_later(:calculate_size) # usando o Delayed Job
Mais um exemploOutro modo seria passar a(s) tarefa(s) para uma lib onde teríamos um arquivo, por exemplo: lib/mailingenvia.rb, da seguinte forma:
require 'net/smtp' class Mailingenvia < Struct.new( MeuParametro ) def perform Contato.deliver_MeuEmail( MeuParametro ) end ende chamá-lo assim:
Delayed::Job.enqueue Mailingenvia.new( @MeuParametro ) # P.S. Quando isso é feito o método perform é chamado
Realizando as tarefas que estão na fila de prioridade
Quando fazemos um tarefa pelo delayed job ela é salva na tabela chamada "delayed_jobs" e para rodá-la é necessário o seguinte comando:
rake jobs:work # para parar de realizar os jobs: CRTL-C
Se desejar apagar todas as tarefas da fila:
rake jobs:clear
Bom, é isso. Para maiores informações veja a página do daleyd job no github ou asista este screencast que eu recomendo fortimente! Até a proxima!
Comentários
Postar um comentário