scheduler_daemon 0.5.1 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +7 -0
- data/Gemfile.lock +36 -0
- data/README.markdown +83 -28
- data/Rakefile +39 -31
- data/VERSION +1 -1
- data/bin/scheduler_daemon +59 -0
- data/lib/loader/scheduler_loader.rb +12 -0
- data/lib/scheduler_daemon.rb +2 -0
- data/lib/scheduler_daemon/base.rb +149 -0
- data/lib/scheduler_daemon/command_line_args_to_hash.rb +47 -0
- data/lib/scheduler_daemon/exception_handler.rb +30 -0
- data/{generators → lib/scheduler_daemon/rails/generators}/scheduler/USAGE +0 -0
- data/lib/scheduler_daemon/rails/generators/scheduler/scheduler_generator.rb +16 -0
- data/lib/scheduler_daemon/rails/generators/scheduler/templates/README +11 -0
- data/lib/scheduler_daemon/rails/generators/scheduler/templates/lib/scheduled_tasks/session_cleaner_task.rb +29 -0
- data/lib/scheduler_daemon/rails/generators/scheduler_task/scheduler_task_generator.rb +17 -0
- data/{generators → lib/scheduler_daemon/rails/generators}/scheduler_task/templates/README +1 -1
- data/lib/scheduler_daemon/rails/generators/scheduler_task/templates/scheduled_tasks/example_task.rb +19 -0
- data/lib/scheduler_daemon/rails/railtie.rb +9 -0
- data/{generators/scheduler/templates/lib/scheduler → lib/scheduler_daemon}/scheduler_task.rb +17 -8
- data/scheduler_daemon.gemspec +58 -35
- data/spec/command_line_args_to_hash_spec.rb +26 -0
- data/spec/scheduled_tasks/session_cleaner_task_spec.rb +11 -7
- data/spec/scheduler_spec.rb +18 -7
- data/spec/spec_helper.rb +16 -0
- metadata +177 -50
- data/.gitignore +0 -1
- data/CHANGES +0 -10
- data/generators/scheduler/scheduler_generator.rb +0 -25
- data/generators/scheduler/templates/README +0 -8
- data/generators/scheduler/templates/bin/boot.rb +0 -10
- data/generators/scheduler/templates/bin/scheduler_daemon.rb +0 -25
- data/generators/scheduler/templates/lib/scheduled_tasks/session_cleaner_task.rb +0 -21
- data/generators/scheduler/templates/lib/scheduler.rb +0 -90
- data/generators/scheduler/templates/lib/scheduler/exception_handler.rb +0 -12
- data/generators/scheduler/templates/lib/scheduler/hijack_puts.rb +0 -8
- data/generators/scheduler_task/scheduler_task_generator.rb +0 -11
- data/generators/scheduler_task/templates/scheduled_tasks/example_task.rb +0 -10
- data/init.rb +0 -1
- data/install.rb +0 -1
- data/lib/scheduler.rb +0 -2
- data/spec/README +0 -1
- data/uninstall.rb +0 -1
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'eventmachine'
|
2
|
-
require 'rufus/scheduler'
|
3
|
-
require File.join(File.dirname(__FILE__), 'scheduler', 'hijack_puts')
|
4
|
-
require File.join(File.dirname(__FILE__), 'scheduler', 'scheduler_task')
|
5
|
-
require File.join(File.dirname(__FILE__), 'scheduler', 'exception_handler')
|
6
|
-
|
7
|
-
module Scheduler
|
8
|
-
class Base
|
9
|
-
attr_reader :load_only, :load_except, :tasks
|
10
|
-
|
11
|
-
def initialize(*command_line_args)
|
12
|
-
@load_only = []
|
13
|
-
@load_except = []
|
14
|
-
@tasks = []
|
15
|
-
@rufus_scheduler = nil
|
16
|
-
|
17
|
-
decide_what_to_run(command_line_args)
|
18
|
-
load_tasks
|
19
|
-
run_scheduler
|
20
|
-
end
|
21
|
-
|
22
|
-
def run_scheduler
|
23
|
-
puts "Starting Scheduler in #{RAILS_ENV}"
|
24
|
-
|
25
|
-
EventMachine::run {
|
26
|
-
@rufus_scheduler = Rufus::Scheduler::EmScheduler.start_new
|
27
|
-
|
28
|
-
def @rufus_scheduler.handle_exception(job, exception)
|
29
|
-
msg = "[#{RAILS_ENV}] scheduler job #{job.job_id} (#{job.tags * ' '}) caught exception #{exception.inspect}"
|
30
|
-
puts msg
|
31
|
-
puts exception.backtrace.join("\n")
|
32
|
-
Scheduler::ExceptionHandler.handle_exception(exception, job, message)
|
33
|
-
end
|
34
|
-
|
35
|
-
# This is where the magic happens. tasks in scheduled_tasks/*.rb are loaded up.
|
36
|
-
tasks.each do |task|
|
37
|
-
if task.should_run_in_current_environment?
|
38
|
-
task.add_to(@rufus_scheduler)
|
39
|
-
else
|
40
|
-
puts "#{task} configured not to run in #{RAILS_ENV} environment; skipping."
|
41
|
-
end
|
42
|
-
end
|
43
|
-
}
|
44
|
-
end
|
45
|
-
|
46
|
-
def load_tasks
|
47
|
-
tasks_to_run.each{|f|
|
48
|
-
begin
|
49
|
-
unless load_only.any? && load_only.all?{|m| f !~ Regexp.new(Regexp.escape(m)) }
|
50
|
-
require f
|
51
|
-
filename = f.split('/').last.split('.').first
|
52
|
-
puts "Loading task #{filename}..."
|
53
|
-
tasks << filename.camelcase.constantize # path/newsfeed_task.rb => NewsfeedTask
|
54
|
-
end
|
55
|
-
rescue Exception => e
|
56
|
-
msg = "Error loading task #{filename}: #{e.class.name}: #{e.message}"
|
57
|
-
puts msg
|
58
|
-
puts e.backtrace.join("\n")
|
59
|
-
Railsbot.say "#{msg}, see log for backtrace" if Rails.env.production? || Rails.env.staging?
|
60
|
-
end
|
61
|
-
}
|
62
|
-
end
|
63
|
-
|
64
|
-
def tasks_to_run
|
65
|
-
task_files = Dir[File.join(File.dirname(__FILE__), %w(scheduled_tasks *.rb))]
|
66
|
-
|
67
|
-
if load_only.any?
|
68
|
-
task_files.reject!{|f| load_only.all?{|m| f !~ Regexp.new(Regexp.escape(m))}}
|
69
|
-
end
|
70
|
-
|
71
|
-
if load_except.any?
|
72
|
-
task_files.reject!{|f| load_except.any?{|m| f =~ Regexp.new(Regexp.escape(m))}}
|
73
|
-
end
|
74
|
-
task_files
|
75
|
-
end
|
76
|
-
|
77
|
-
# takes input from command line to later modify list of tasks to run
|
78
|
-
def decide_what_to_run(command_line_args)
|
79
|
-
# allow ruby daemons/bin/task_runner.rb run -- --only=toadcamp,newsfeed
|
80
|
-
if only_arg = command_line_args.detect{|arg| arg =~ /^--only/}
|
81
|
-
@load_only = only_arg.split('=').last.split(',')
|
82
|
-
end
|
83
|
-
|
84
|
-
# allow ruby daemons/bin/task_runner.rb run -- --except=toadcamp
|
85
|
-
if except_arg = command_line_args.detect{|arg| arg =~ /^--except/}
|
86
|
-
@load_except = except_arg.split('=').last.split(',')
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
module Scheduler
|
2
|
-
class ExceptionHandler
|
3
|
-
# Change me to do something meaningful
|
4
|
-
def self.handle_exception(exception, job, message)
|
5
|
-
# If your team all hangs out in Campfire, you might want to make a
|
6
|
-
# Campfire class that makes use of the tinder gem to write these errors there.
|
7
|
-
#
|
8
|
-
# eg:
|
9
|
-
# Campfire.say "#{msg}, see log for backtrace" if Rails.env.production? || Rails.env.staging?
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,8 +0,0 @@
|
|
1
|
-
# hijack puts to log with a timestamp, since any output is going to be logged anyway.
|
2
|
-
module Kernel
|
3
|
-
def puts_with_timestamp(*args)
|
4
|
-
time = Time.respond_to?(:zone) ? Time.zone.now.to_s : Time.now.to_s
|
5
|
-
puts_without_timestamp(%([#{time}] #{args.join("\n")}))
|
6
|
-
end
|
7
|
-
alias_method_chain :puts, :timestamp
|
8
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
class SchedulerTaskGenerator < Rails::Generator::NamedBase
|
2
|
-
def manifest
|
3
|
-
record do |m|
|
4
|
-
m.directory File.join('scheduler', 'lib', 'scheduled_tasks')
|
5
|
-
|
6
|
-
m.template 'scheduled_tasks/example_task.rb', "scheduler/lib/scheduled_tasks/#{file_name}_task.rb", :assigns => { :class_name => class_name }
|
7
|
-
|
8
|
-
m.readme('README')
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
data/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'scheduler'
|
data/install.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
puts File.read(File.join(File.dirname(__FILE__), 'README.markdown'))
|
data/lib/scheduler.rb
DELETED
data/spec/README
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
To install the specs for the scheduler daemon, copy this "spec" folder to one called "scheduler_daemon" in your project's spec folder.
|
data/uninstall.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
puts "Nooooooooo! but we were so good together!"
|