backgroundrb-rails3 1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. data/.autotest +17 -0
  2. data/ChangeLog +50 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE +4 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README +22 -0
  7. data/Rakefile +128 -0
  8. data/TODO.org +5 -0
  9. data/app/controller/backgroundrb_status_controller.rb +6 -0
  10. data/backgroundrb-rails3.gemspec +219 -0
  11. data/config/backgroundrb.yml +11 -0
  12. data/doc/Rakefile +5 -0
  13. data/doc/config.yaml +2 -0
  14. data/doc/content/advanced/advanced.txt +76 -0
  15. data/doc/content/advanced/advanced.yaml +4 -0
  16. data/doc/content/bugs/bugs.txt +20 -0
  17. data/doc/content/bugs/bugs.yaml +5 -0
  18. data/doc/content/community/community.txt +36 -0
  19. data/doc/content/community/community.yaml +5 -0
  20. data/doc/content/content.txt +168 -0
  21. data/doc/content/content.yaml +5 -0
  22. data/doc/content/faq/faq.txt +41 -0
  23. data/doc/content/faq/faq.yaml +5 -0
  24. data/doc/content/rails/rails.txt +182 -0
  25. data/doc/content/rails/rails.yaml +5 -0
  26. data/doc/content/scheduling/scheduling.txt +166 -0
  27. data/doc/content/scheduling/scheduling.yaml +5 -0
  28. data/doc/content/workers/workers.txt +178 -0
  29. data/doc/content/workers/workers.yaml +5 -0
  30. data/doc/layouts/default/default.erb +56 -0
  31. data/doc/layouts/default/default.yaml +4 -0
  32. data/doc/lib/default.rb +7 -0
  33. data/doc/output/Assets/BG-Ad-Top.png +0 -0
  34. data/doc/output/Assets/BG-Body.png +0 -0
  35. data/doc/output/Assets/BG-Feed.png +0 -0
  36. data/doc/output/Assets/BG-Menu-Hover.png +0 -0
  37. data/doc/output/Assets/BG-Menu.png +0 -0
  38. data/doc/output/Assets/BG-Sidebar-Bottom.png +0 -0
  39. data/doc/output/Assets/Button-Feed.png +0 -0
  40. data/doc/output/images/bg-ad-top.png +0 -0
  41. data/doc/output/images/bg-body.png +0 -0
  42. data/doc/output/images/bg-feed.gif +0 -0
  43. data/doc/output/images/bg-footer.jpg +0 -0
  44. data/doc/output/images/bg-header.jpg +0 -0
  45. data/doc/output/images/bg-menu-hover.png +0 -0
  46. data/doc/output/images/bg-menu.png +0 -0
  47. data/doc/output/images/bg-sidebar-bottom.gif +0 -0
  48. data/doc/output/images/button-feed.png +0 -0
  49. data/doc/output/images/icon-comment.png +0 -0
  50. data/doc/output/images/more_icon.gif +0 -0
  51. data/doc/output/style.css +299 -0
  52. data/doc/page_defaults.yaml +13 -0
  53. data/doc/tasks/default.rake +3 -0
  54. data/doc/templates/default/default.txt +1 -0
  55. data/doc/templates/default/default.yaml +4 -0
  56. data/examples/backgroundrb.yml +25 -0
  57. data/examples/foo_controller.rb +48 -0
  58. data/examples/god_worker.rb +7 -0
  59. data/examples/worker_tests/god_worker_test.rb +8 -0
  60. data/examples/workers/error_worker.rb +17 -0
  61. data/examples/workers/foo_worker.rb +38 -0
  62. data/examples/workers/god_worker.rb +7 -0
  63. data/examples/workers/model_worker.rb +13 -0
  64. data/examples/workers/renewal_worker.rb +11 -0
  65. data/examples/workers/rss_worker.rb +26 -0
  66. data/examples/workers/server_worker.rb +31 -0
  67. data/examples/workers/world_worker.rb +12 -0
  68. data/examples/workers/xmpp_worker.rb +7 -0
  69. data/init.rb +7 -0
  70. data/install.rb +1 -0
  71. data/know_issues.org +5 -0
  72. data/lib/backgroundrb.rb +1 -0
  73. data/lib/backgroundrb/bdrb_client_helper.rb +8 -0
  74. data/lib/backgroundrb/bdrb_cluster_connection.rb +156 -0
  75. data/lib/backgroundrb/bdrb_config.rb +43 -0
  76. data/lib/backgroundrb/bdrb_conn_error.rb +29 -0
  77. data/lib/backgroundrb/bdrb_connection.rb +179 -0
  78. data/lib/backgroundrb/bdrb_job_queue.rb +79 -0
  79. data/lib/backgroundrb/bdrb_result.rb +19 -0
  80. data/lib/backgroundrb/bdrb_start_stop.rb +146 -0
  81. data/lib/backgroundrb/rails_worker_proxy.rb +181 -0
  82. data/lib/backgroundrb/railtie.rb +48 -0
  83. data/lib/generators/backgroundrb/bdrb_migration/USAGE +12 -0
  84. data/lib/generators/backgroundrb/bdrb_migration/bdrb_migration_generator.rb +15 -0
  85. data/lib/generators/backgroundrb/bdrb_migration/templates/migration.rb +27 -0
  86. data/lib/generators/backgroundrb/worker/USAGE +16 -0
  87. data/lib/generators/backgroundrb/worker/templates/unit_test.rb +12 -0
  88. data/lib/generators/backgroundrb/worker/templates/worker.rb +7 -0
  89. data/lib/generators/backgroundrb/worker/worker_generator.rb +14 -0
  90. data/lib/tasks/backgroundrb_tasks.rake +103 -0
  91. data/release_notes.org +48 -0
  92. data/release_points.org +46 -0
  93. data/script/backgroundrb +52 -0
  94. data/script/bdrb_test_helper.rb +99 -0
  95. data/script/load_worker_env.rb +31 -0
  96. data/script/monitrc +25 -0
  97. data/server/backgroundrb_server.rb +12 -0
  98. data/server/lib/bdrb_result_storage.rb +62 -0
  99. data/server/lib/bdrb_server_helper.rb +24 -0
  100. data/server/lib/bdrb_thread_pool.rb +127 -0
  101. data/server/lib/cron_trigger.rb +197 -0
  102. data/server/lib/invalid_dump_error.rb +4 -0
  103. data/server/lib/log_worker.rb +25 -0
  104. data/server/lib/master_proxy.rb +140 -0
  105. data/server/lib/master_worker.rb +187 -0
  106. data/server/lib/meta_worker.rb +432 -0
  107. data/server/lib/trigger.rb +34 -0
  108. data/test/bdrb_client_test_helper.rb +5 -0
  109. data/test/bdrb_test_helper.rb +35 -0
  110. data/test/client/backgroundrb.yml +17 -0
  111. data/test/client/test_bdrb_client_helper.rb +13 -0
  112. data/test/client/test_bdrb_cluster_connection.rb +162 -0
  113. data/test/client/test_bdrb_config.rb +20 -0
  114. data/test/client/test_bdrb_connection.rb +29 -0
  115. data/test/client/test_bdrb_job_queue.rb +63 -0
  116. data/test/client/test_worker_proxy.rb +130 -0
  117. data/test/server/test_cron_trigger.rb +281 -0
  118. data/test/server/test_master_proxy.rb +54 -0
  119. data/test/server/test_master_worker.rb +157 -0
  120. data/test/server/test_meta_worker.rb +281 -0
  121. data/test/server/test_result_storage.rb +14 -0
  122. data/test/socket_mocker.rb +34 -0
  123. data/test/workers/bar_worker.rb +10 -0
  124. data/test/workers/foo_worker.rb +10 -0
  125. data/uninstall.rb +1 -0
  126. metadata +345 -0
@@ -0,0 +1,79 @@
1
+ # Model for storing jobs/tasks persisted to the database
2
+
3
+ class BdrbJobQueue < ActiveRecord::Base
4
+ validates_uniqueness_of :job_key,:scope => [:worker_name,:worker_key]
5
+ # find next task from the table
6
+ def self.find_next(worker_name,worker_key = nil)
7
+ returned_job = nil
8
+ ActiveRecord::Base.verify_active_connections!
9
+ transaction do
10
+ unless worker_key
11
+ #use ruby time stamps for time calculations as db might have different times than what is calculated by ruby/rails
12
+ t_job = find(:first,:conditions => [" worker_name = ? AND taken = ? AND scheduled_at <= ? ", worker_name, 0, Time.now.utc ],:lock => true, :order => 'priority desc')
13
+ else
14
+ t_job = find(:first,:conditions => [" worker_name = ? AND taken = ? AND worker_key = ? AND scheduled_at <= ? ", worker_name, 0, worker_key, Time.now.utc ],:lock => true)
15
+ end
16
+ if t_job
17
+ t_job.taken = 1
18
+ t_job.started_at = Time.now.utc
19
+ t_job.save
20
+ returned_job = t_job
21
+ end
22
+ end
23
+ returned_job
24
+ end
25
+
26
+ #these accessors get around any possible character encoding issues with the database
27
+ def args=(args)
28
+ write_attribute(:args, Base64.encode64(args))
29
+ end
30
+
31
+ def args
32
+ Base64.decode64(read_attribute(:args))
33
+ end
34
+
35
+ # release a job and mark it to be unfinished and free.
36
+ # useful, if inside a worker, processing of this job failed and you want it to process later
37
+ def release_job
38
+ ActiveRecord::Base.verify_active_connections!
39
+ self.class.transaction do
40
+ self.taken = 0
41
+ self.started_at = nil
42
+ self.save
43
+ end
44
+ end
45
+
46
+ # insert a new job for processing. jobs added will be automatically picked by the appropriate worker
47
+ def self.insert_job(options = { })
48
+ ActiveRecord::Base.verify_active_connections!
49
+ transaction do
50
+ options.merge!(:submitted_at => Time.now.utc,:finished => 0,:taken => 0)
51
+ t_job = new(options)
52
+ t_job.save
53
+ end
54
+ end
55
+
56
+ # remove a job from table
57
+ def self.remove_job(options = { })
58
+ ActiveRecord::Base.verify_active_connections!
59
+ transaction do
60
+ t_job_id = find(:first, :conditions => options.merge(:finished => 0,:taken => 0),:lock => true)
61
+ delete(t_job_id)
62
+ end
63
+ end
64
+
65
+ # Mark a job as finished
66
+ def finish!
67
+ ActiveRecord::Base.verify_active_connections!
68
+ self.class.transaction do
69
+ self.finished = 1
70
+ self.finished_at = Time.now.utc
71
+ self.job_key = "finished_#{Time.now.utc.to_i}_#{job_key}"
72
+ self.save
73
+ end
74
+ Thread.current[:persistent_job_id] = nil
75
+ Thread.current[:job_key] = nil
76
+ nil
77
+ end
78
+ end
79
+
@@ -0,0 +1,19 @@
1
+ module BackgrounDRb
2
+ class Result
3
+ def initialize results
4
+ @results = resuls
5
+ end
6
+
7
+ def async_response?
8
+ !(@results[:result] == true)
9
+ end
10
+
11
+ def sync_response?
12
+ (@results[:result] == true)
13
+ end
14
+
15
+ def error?
16
+ !(@results[:result_flag] == "ok")
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,146 @@
1
+ # see http://refspecs.freestandards.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptact.html
2
+ # for LSB-compliancy info
3
+ module BackgrounDRb
4
+ class StartStop
5
+ def start
6
+ if running? # starting an already running process is considered a success
7
+ puts "BackgrounDRb Already Running"
8
+ exit(0)
9
+ elsif dead? # dead, but pid exists
10
+ remove_pidfiles
11
+ end
12
+
13
+ # status == 3, not running.
14
+ STDOUT.sync = true
15
+ print("Starting BackgrounDRb .... ")
16
+ start_bdrb
17
+ puts "Success!"
18
+ end
19
+
20
+ def stop
21
+ pid_files = Dir["#{RAILS_HOME}/tmp/pids/backgroundrb_*.pid"]
22
+ puts "BackgrounDRb Not Running" if pid_files.empty?
23
+ pid_files.each do |x|
24
+ begin
25
+ kill_process(x)
26
+ rescue Errno::ESRCH
27
+ # stopping an already stopped process is considered a success (exit status 0)
28
+ end
29
+ end
30
+ remove_pidfiles
31
+ end
32
+
33
+ # returns the correct lsb code for the status:
34
+ # 0 program is running or service is OK
35
+ # 1 program is dead and /var/run pid file exists
36
+ # 3 program is not running
37
+ def status
38
+ @status ||= begin
39
+ if pidfile_exists? and process_running?
40
+ 0
41
+ elsif pidfile_exists? # but not process_running
42
+ 1
43
+ else
44
+ 3
45
+ end
46
+ end
47
+
48
+ return @status
49
+ end
50
+
51
+ def pidfile_exists?; File.exists?(PID_FILE); end
52
+
53
+ def process_running?
54
+ begin
55
+ Process.kill(0,self.pid)
56
+ true
57
+ rescue Errno::ESRCH
58
+ false
59
+ end
60
+ end
61
+
62
+ def running?;status == 0;end
63
+ # pidfile exists but process isn't running
64
+
65
+ def dead?;status == 1;end
66
+
67
+ def pid
68
+ File.read(PID_FILE).strip.to_i if pidfile_exists?
69
+ end
70
+
71
+ def remove_pidfiles
72
+ require 'fileutils'
73
+ FileUtils.rm_r(Dir["#{RAILS_HOME}/tmp/pids/backgroundrb_*.pid"])
74
+ end
75
+
76
+ def start_bdrb
77
+ require "rubygems"
78
+ require "yaml"
79
+ require "erb"
80
+ require "logger"
81
+ require "packet"
82
+ require "optparse"
83
+
84
+ require "bdrb_config"
85
+ require RAILS_HOME + "/config/boot"
86
+ require "active_support"
87
+
88
+ BackgrounDRb::Config.parse_cmd_options ARGV
89
+
90
+ require RAILS_HOME + "/config/environment"
91
+ require "bdrb_job_queue"
92
+ require "backgroundrb_server"
93
+
94
+ #proper way to daemonize - double fork to ensure parent can have no interest in the grandchild
95
+ if fork # Parent exits, child continues.
96
+ sleep(5)
97
+ exit(0)
98
+ else
99
+ Process.setsid # Become session leader.
100
+
101
+ op = File.open(PID_FILE, "w")
102
+ op.write(Process.pid().to_s)
103
+ op.close
104
+
105
+ if BDRB_CONFIG[:backgroundrb][:log].nil? or BDRB_CONFIG[:backgroundrb][:log] != 'foreground'
106
+ redirect_io(SERVER_LOGGER)
107
+ end
108
+ $0 = "backgroundrb master"
109
+ BackgrounDRb::MasterProxy.new()
110
+ end
111
+
112
+ #File.open(PID_FILE, "w") {|pidfile| pidfile.write(main_pid)}
113
+ end
114
+
115
+ def kill_process(pid_file)
116
+ pid = File.open(pid_file, "r") { |pid_handle| pid_handle.gets.strip.to_i }
117
+ pgid = Process.getpgid(pid)
118
+ Process.kill('-TERM', pgid)
119
+ File.delete(pid_file) if File.exists?(pid_file)
120
+ puts "Stopped BackgrounDRb worker with pid #{pid}"
121
+ end
122
+
123
+
124
+ # Free file descriptors and
125
+ # point them somewhere sensible
126
+ # STDOUT/STDERR should go to a logfile
127
+ def redirect_io(logfile_name)
128
+ begin; STDIN.reopen "/dev/null"; rescue ::Exception; end
129
+
130
+ if logfile_name
131
+ begin
132
+ STDOUT.reopen logfile_name, "a"
133
+ STDOUT.sync = true
134
+ rescue ::Exception
135
+ begin; STDOUT.reopen "/dev/null"; rescue ::Exception; end
136
+ end
137
+ else
138
+ begin; STDOUT.reopen "/dev/null"; rescue ::Exception; end
139
+ end
140
+
141
+ begin; STDERR.reopen STDOUT; rescue ::Exception; end
142
+ STDERR.sync = true
143
+ end
144
+ end
145
+
146
+ end
@@ -0,0 +1,181 @@
1
+ module BackgrounDRb
2
+ # A Worker proxy, which uses +method_missing+ for delegating method calls to the workers
3
+ class RailsWorkerProxy
4
+ attr_accessor :worker_name, :worker_method, :data, :worker_key,:middle_man
5
+
6
+ # create new worker proxy
7
+ def initialize(p_worker_name,p_worker_key = nil,p_middle_man = nil)
8
+ @worker_name = p_worker_name
9
+ @middle_man = p_middle_man
10
+ @worker_key = p_worker_key
11
+ @tried_connections = []
12
+ end
13
+
14
+ def method_missing(method_id,*args)
15
+ worker_method = method_id.to_s
16
+ arguments = args.first
17
+
18
+ arg,job_key,host_info,scheduled_at,priority = arguments && arguments.values_at(:arg,:job_key,:host,:scheduled_at, :priority)
19
+
20
+ # allow both arg and args
21
+ arg ||= arguments && arguments[:args]
22
+
23
+ new_schedule = (scheduled_at && scheduled_at.respond_to?(:utc)) ? scheduled_at.utc : Time.now.utc
24
+
25
+ if worker_method =~ /^async_(\w+)/
26
+ method_name = $1
27
+ worker_options = compact(:worker => worker_name,:worker_key => worker_key,
28
+ :worker_method => method_name,:job_key => job_key, :arg => arg)
29
+ run_method(host_info,:ask_work,worker_options)
30
+ elsif worker_method =~ /^enq_(\w+)/i
31
+ raise NoJobKey.new("Must specify a job key with enqueued tasks") if job_key.blank?
32
+ method_name = $1
33
+ marshalled_args = Marshal.dump(arg)
34
+ enqueue_task(compact(:worker_name => worker_name.to_s,:worker_key => worker_key.to_s,
35
+ :worker_method => method_name.to_s,:job_key => job_key.to_s, :priority => priority,
36
+ :args => marshalled_args,:timeout => arguments ? arguments[:timeout] : nil,:scheduled_at => new_schedule))
37
+ elsif worker_method =~ /^deq_(\w+)/i
38
+ raise NoJobKey.new("Must specify a job key to dequeue tasks") if job_key.blank?
39
+ method_name = $1
40
+ dequeue_task(compact(:worker_name => worker_name.to_s,:worker_key => worker_key.to_s,
41
+ :worker_method => method_name.to_s,:job_key => job_key.to_s))
42
+ else
43
+ worker_options = compact(:worker => worker_name,:worker_key => worker_key,
44
+ :worker_method => worker_method,:job_key => job_key,:arg => arg)
45
+ run_method(host_info,:send_request,worker_options)
46
+ end
47
+ end
48
+
49
+ # enqueue tasks to the worker pool
50
+ def enqueue_task options = {}
51
+ BdrbJobQueue.insert_job(options)
52
+ end
53
+
54
+ # remove tasks from the worker pool
55
+ def dequeue_task options = {}
56
+ BdrbJobQueue.remove_job(options)
57
+ end
58
+
59
+ # invoke method on worker
60
+ def run_method host_info,method_name,worker_options = {}
61
+ result = []
62
+ connection = choose_connection(host_info)
63
+ raise NoServerAvailable.new("No BackgrounDRb server is found running") if connection.blank?
64
+ if host_info == :local or host_info.is_a?(String)
65
+ result << invoke_on_connection(connection,method_name,worker_options)
66
+ elsif host_info == :all
67
+ succeeded = false
68
+ begin
69
+ connection.each { |conn| result << invoke_on_connection(conn,method_name,worker_options) }
70
+ succeeded = true
71
+ rescue BdrbConnError; end
72
+ raise NoServerAvailable.new("No BackgrounDRb server is found running") unless succeeded
73
+ else
74
+ @tried_connections = [connection.server_info]
75
+ begin
76
+ result << invoke_on_connection(connection,method_name,worker_options)
77
+ rescue BdrbConnError => e
78
+ connection = middle_man.find_next_except_these(@tried_connections)
79
+ @tried_connections << connection.server_info
80
+ retry
81
+ end
82
+ end
83
+ #return nil if method_name == :ask_work
84
+ process_result(return_result(result))
85
+ end
86
+
87
+ def process_result t_result
88
+ case t_result
89
+ when Hash
90
+ if(t_result[:result] == true && t_result[:type] = :response)
91
+ if(t_result[:result_flag] == "ok")
92
+ return t_result[:data]
93
+ else
94
+ raise RemoteWorkerError.new("Error while executing worker method")
95
+ end
96
+ elsif(t_result[:result_flag] == "ok")
97
+ "ok"
98
+ elsif(t_result[:result_flag] == "error")
99
+ raise RemoteWorkerError.new("Error while executing worker method")
100
+ end
101
+ when Array
102
+ t_result
103
+ end
104
+ end
105
+
106
+ # choose a backgroundrb server connection and invoke worker method on it.
107
+ def invoke_on_connection connection,method_name,options = {}
108
+ raise NoServerAvailable.new("No BackgrounDRb is found running") unless connection
109
+ connection.send(method_name,options)
110
+ end
111
+
112
+ # get results back from the cache. Cache can be in-memory worker cache or memcache
113
+ # based cache
114
+ def ask_result job_key
115
+ options = compact(:worker => worker_name,:worker_key => worker_key,:job_key => job_key)
116
+ if BDRB_CONFIG[:backgroundrb][:result_storage] == 'memcache'
117
+ return_result_from_memcache(options)
118
+ else
119
+ result = middle_man.backend_connections.map { |conn| conn.ask_result(options) }
120
+ return_result(result)
121
+ end
122
+ end
123
+
124
+ # return runtime information about worker
125
+ def worker_info
126
+ t_connections = middle_man.backend_connections
127
+ result = t_connections.map { |conn| conn.worker_info(compact(:worker => worker_name,:worker_key => worker_key)) }
128
+ return_result(result)
129
+ end
130
+
131
+ # generate worker key
132
+ def gen_key options
133
+ key = [options[:worker],options[:worker_key],options[:job_key]].compact.join('_')
134
+ key
135
+ end
136
+
137
+ # return result from memcache
138
+ def return_result_from_memcache options = {}
139
+ middle_man.cache[gen_key(options)]
140
+ end
141
+
142
+ # reset result within memcache for given key
143
+ def reset_memcache_result(job_key,value)
144
+ options = compact(:worker => worker_name,:worker_key => worker_key,\
145
+ :job_key => job_key)
146
+ key = gen_key(options)
147
+ middle_man.cache[key] = value
148
+ value
149
+ end
150
+
151
+ def return_result result
152
+ result = Array(result)
153
+ result.size <= 1 ? result[0] : result
154
+ end
155
+
156
+ # delete a worker
157
+ def delete
158
+ middle_man.backend_connections.each do |connection|
159
+ connection.delete_worker(compact(:worker => worker_name, :worker_key => worker_key))
160
+ end
161
+ return worker_key
162
+ end
163
+
164
+ # choose a worker
165
+ def choose_connection host_info
166
+ case host_info
167
+ when :all; middle_man.backend_connections
168
+ when :local; middle_man.find_local
169
+ when String; middle_man.find_connection(host_info)
170
+ else; middle_man.choose_server
171
+ end
172
+ end
173
+
174
+ # helper method to compact a hash and for getting rid of nil parameters
175
+ def compact(options = { })
176
+ options.delete_if { |key,value| value.nil? }
177
+ options
178
+ end
179
+ end # end of RailsWorkerProxy class
180
+
181
+ end # end of BackgrounDRb module
@@ -0,0 +1,48 @@
1
+ # Backgroundrb
2
+ # FIXME: check if data that we are writing to the socket should end with newline
3
+ require "pathname"
4
+ require "packet"
5
+ require "ostruct"
6
+
7
+ require "rails"
8
+ require "backgroundrb"
9
+
10
+ require "backgroundrb/bdrb_config"
11
+ require "backgroundrb/bdrb_client_helper"
12
+ require "backgroundrb/bdrb_job_queue"
13
+ require "backgroundrb/bdrb_conn_error"
14
+ require "backgroundrb/rails_worker_proxy"
15
+ require "backgroundrb/bdrb_connection"
16
+ require "backgroundrb/bdrb_cluster_connection"
17
+ require "backgroundrb/bdrb_start_stop"
18
+ require "backgroundrb/bdrb_result"
19
+
20
+
21
+ module BackgrounDRb
22
+ class Railtie < Rails::Railtie
23
+ config.bdrb = ActiveSupport::OrderedOptions.new
24
+
25
+ unless config.bdrb.has_key? :root
26
+ config.bdrb.root = File.expand_path(File.join(__FILE__, '..', '..', '..'))
27
+ end
28
+ BackgrounDRb::BACKGROUNDRB_ROOT = config.bdrb.root
29
+
30
+ config.before_configuration do
31
+ config_file = "#{Rails.root}/config/backgroundrb.yml"
32
+
33
+ if File.exists?(config_file) && !config.bdrb.has_key?(:config)
34
+ config.bdrb.config = BackgrounDRb::Config.read_config(config_file)
35
+ end
36
+ BackgrounDRb::BDRB_CONFIG = config.bdrb.config
37
+
38
+ MiddleMan = BackgrounDRb::ClusterConnection.new if File.exists?(config_file)
39
+ end
40
+
41
+ rake_tasks do
42
+ load "tasks/backgroundrb_tasks.rake"
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+