Wątek pracujący w tle

Hej,

Czy w RoR jest możliwość ustawienia wątku który będzie w tle wykonywał pewne operacje? Wiem że można podłączyć to pod crona ale on ma granulację co 1 minutę a ja potrzebuję co 10 sekund. Chcę wykonwać akcję odświeżenia wartości w bazie(lub globalnej) co 10 sekund i co 5 minut dodać wpis do bazy(to mogę zrobić cronem). Aktualnie napisałem osobną aplikację w javie która to robi tylko że to nie jest zbyt dobre rozwiązanie. Chciałbym mieć całą funkcjonalność w jednej aplikacji. Da się to zrobić?

To jest właśnie funkcjonalność do jobów cron’owych. Czytałem o tym ale nie znalazłem sposobu na uruchamianie ich co 10 sekund. Ewentualnie można 6 tasków i w każdym sleep 10sek, 20sek, 30sek … ale to nie wygląda :confused:

np. http://sidekiq.org + https://github.com/tobiassvn/sidetiq

Jeśli to ma być coś al’a cron tylko częściej to https://github.com/tomykaira/clockwork
Jeśli to ma być typowy background job to możesz użyć https://github.com/brandonhilkert/sucker_punch (in memory)
albo persystentnie to wtedy te narzędzia o których pisał @mark

Clockwork wygląda bardzo obiecująco. Wygląda że mogę zrealizować to co chcę. Jak jednak połączyć się z bazą w railsach?

Mam takiego joba:

require 'clockwork'

module Clockwork
  handler do |job|
    case job
    when 'sh1_curr'
      out2_obj = CurrentTemp.where(:name => 'sh1').take; **<-- wiersz z błędem**
      if(out2_obj != nil) then
        out2_obj = CurrentTemp.new
        out2_obj.name = 'sh1'
        out2_obj. val = 3
      else
        out2_obj.val = 2
        out2_obj.save
      end

    when 'sh2_curr'
      puts "sh2_curr"

    when 'out1_curr'
      puts "out1_curr"

    when 'out2_curr'
      puts "out2_curr"

    else
    puts "Couldn't find your job!"
    end
  end

  every(10.seconds, 'sh1_curr')
  every(10.seconds, 'sh2_curr')
  every(10.seconds, 'out1_curr')
  every(10.seconds, 'out2_curr')
end

Dostaje taki błąd:

clockwork app/jobs/job.rb
I, [2015-11-21T22:01:54.692650 #25645] INFO – : Starting clock for 4 events: [ sh1_curr sh2_curr out1_curr out2_curr ]
I, [2015-11-21T22:01:54.692722 #25645] INFO – : Triggering ‘sh1_curr’
E, [2015-11-21T22:01:54.692763 #25645] ERROR – : uninitialized constant Clockwork::CurrentTemp (NameError)
/home/skoczo/ruby-workspace/Wedzarnia/app/jobs/job.rb:7:in block in <module:Clockwork>' /home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/event.rb:54:incall’
/home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/event.rb:54:in execute' /home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/event.rb:44:inrun’
/home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/manager.rb:75:in block in tick' /home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/manager.rb:73:ineach’
/home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/manager.rb:73:in tick' /home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/manager.rb:64:inblock in run’
/home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/manager.rb:63:in loop' /home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork/manager.rb:63:inrun’
/home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/lib/clockwork.rb:46:in run' /home/skoczo/.gem/ruby/2.2.0/gems/clockwork-1.2.0/bin/clockwork:19:in<top (required)>’
/home/skoczo/.gem/ruby/2.2.0/bin/clockwork:23:in load' /home/skoczo/.gem/ruby/2.2.0/bin/clockwork:23:in
I, [2015-11-21T22:01:54.692832 #25645] INFO – : Triggering ‘sh2_curr’
sh2_curr
I, [2015-11-21T22:01:54.692876 #25645] INFO – : Triggering ‘out1_curr’
out1_curr
I, [2015-11-21T22:01:54.692926 #25645] INFO – : Triggering ‘out2_curr’
out2_curr

Edit: Znalazłem rozwiązanie. Przekopiowałem joba do katalogu config i dodałem dwa wpisy na początek:

require_relative 'boot'
require_relative 'environment'