Hintergrundtasks mit "daemons" realisieren 0

Posted by fwoeck
on Wednesday, October 01
> sudo gem install daemons

> script/plugin install git://github.com/dougal/daemon_generator.git -c

> script/generate daemon mailer -c

> RAILS_ENV=development lib/daemons/mailer_ctl start

mit dem File lib/daemons/mailer.rb:

#!/usr/bin/env ruby

# You might want to change this
ENV["RAILS_ENV"] ||= "development" 

require File.dirname(__FILE__) + "/../../config/environment" 

$running = true
Signal.trap("TERM") do 
  $running = false
end

while($running) do
  mailing = Mailing.next_for_delivery
  if mailing
    mailing.deliver
  else
    sleep 15
  end
end

# mailings_controller.rb
def deliver
  Mailing.update(params[:id], :scheduled_at => Time.now)
  flash[:notice] = "Delivering mailing" 
  redirect_to mailings_url
end

# models/mailing.rb
def self.next_for_delivery
  Mailing.first(:conditions => ["delivered_at IS NULL AND scheduled_at <= ?", Time.now.utc], :order => "scheduled_at")
end

def deliver
  update_attribute(:scheduled_at, nil)
  sleep 10 # placeholder for sending email
  update_attribute(:delivered_at, Time.now)
end