Desculpe, seu navegador não suporta JavaScript! Casa Open: Tarefas em background - delayed job

Tarefas em background - delayed job

Realizar tarefas em background é uma boa saída para melhorar a resposta da sua aplicação. Geralmente usamos este recurso para tarefas como enviar e-mail, redimensionar imagens, postar algo no twitter... isso, simplesmente pelo fato que estas tarefas não necessitarem de resposta imediata para o usuário continuar usando o sistema.
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:migrate 
    Isso 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 exemplo

    Outro 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
    end
    e 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

    Casa Open | by Samuel Vinícius, Belo Horizonte - MG. Powered by Blogger