delayed_job_master 2.0.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +31 -34
  3. data/.gitignore +0 -2
  4. data/CHANGELOG.md +13 -0
  5. data/README.md +46 -33
  6. data/delayed_job_master.gemspec +8 -5
  7. data/lib/delayed/master/callbacks.rb +37 -0
  8. data/lib/delayed/master/command.rb +28 -5
  9. data/lib/delayed/master/config.rb +51 -58
  10. data/lib/delayed/master/core.rb +146 -0
  11. data/lib/delayed/master/database.rb +72 -0
  12. data/lib/delayed/master/file_reopener.rb +18 -0
  13. data/lib/delayed/master/forker.rb +30 -19
  14. data/lib/delayed/master/job_checker.rb +91 -47
  15. data/lib/delayed/master/job_finder.rb +31 -0
  16. data/lib/delayed/master/job_listener.rb +31 -0
  17. data/lib/delayed/master/monitoring.rb +37 -36
  18. data/lib/delayed/master/postgresql/job_listener.rb +73 -0
  19. data/lib/delayed/master/postgresql/job_notifier.rb +45 -0
  20. data/lib/delayed/master/safe_array.rb +30 -0
  21. data/lib/delayed/master/signaler.rb +17 -7
  22. data/lib/delayed/master/sleep.rb +18 -0
  23. data/lib/delayed/master/worker/backend/active_record.rb +41 -0
  24. data/lib/delayed/master/worker/extension.rb +14 -0
  25. data/lib/delayed/master/worker/lifecycle.rb +10 -0
  26. data/lib/delayed/master/worker/plugins/all.rb +17 -0
  27. data/lib/delayed/master/worker/plugins/executor_wrapper.rb +23 -0
  28. data/lib/delayed/master/worker/plugins/memory_checker.rb +28 -0
  29. data/lib/delayed/master/worker/plugins/signal_handler.rb +35 -0
  30. data/lib/delayed/master/worker/plugins/status_notifier.rb +21 -0
  31. data/lib/delayed/master/worker/thread_pool.rb +64 -0
  32. data/lib/delayed/master/worker/thread_worker.rb +65 -0
  33. data/lib/delayed/master/worker.rb +8 -7
  34. data/lib/delayed/master/worker_setting.rb +72 -0
  35. data/lib/delayed/master.rb +7 -100
  36. data/lib/delayed_job_master/railtie.rb +16 -0
  37. data/lib/delayed_job_master/version.rb +5 -0
  38. data/lib/delayed_job_master.rb +15 -1
  39. data/lib/generators/delayed_job_master/templates/config.rb +14 -14
  40. data/lib/generators/delayed_job_master/templates/script +1 -1
  41. metadata +71 -17
  42. data/gemfiles/rails50.gemfile +0 -7
  43. data/gemfiles/rails51.gemfile +0 -7
  44. data/gemfiles/rails52.gemfile +0 -7
  45. data/lib/delayed/master/database_detector.rb +0 -37
  46. data/lib/delayed/master/job_counter.rb +0 -26
  47. data/lib/delayed/master/plugins/memory_checker.rb +0 -24
  48. data/lib/delayed/master/plugins/signal_handler.rb +0 -31
  49. data/lib/delayed/master/plugins/status_notifier.rb +0 -17
  50. data/lib/delayed/master/util/file_reopener.rb +0 -18
  51. data/lib/delayed/master/version.rb +0 -5
  52. data/lib/delayed/master/worker_extension.rb +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2352f0e35b9bf06ef9362e797ea35d8b848583d03d8aea62235497dc8b938cc9
4
- data.tar.gz: 205e1a4b04a8ad361ff0122acc65bcaa02439eaf5bbe91a258652dfa02d79eb9
3
+ metadata.gz: dbc7748a97c2f7aa0869b23cc1e00fbc8682d9f527e9c151d77a018c227c218e
4
+ data.tar.gz: aa7ba20301d0881e0a76ae66e70a72a10b9baed00cd0137c0a7118f6fbdd1ceb
5
5
  SHA512:
6
- metadata.gz: f02b0683502467943f0e1e81543705b7d69febdcf22a846d05525a95fa13844552c6d3215df4f2b87fbfdf859d9178eb18350d746a8f92743752ac0cfa2f44f2
7
- data.tar.gz: 104a01e051fce6f6fba061c38e1674a8c3a8bd23d9ae367399a9825fc0a560fc8657dd863d6dca053c734761b93160d70b50c5356343ec12320b572b8937f019
6
+ metadata.gz: 52b34fa14373943cdaf4265a6076781d3e032916e8cc3b1f33c8da1a7fa4986309f99a329798213212dec17c1e0a8ba5c3ab4947b54802156e6dce30e6d044ea
7
+ data.tar.gz: 63ef8e75c2ee50e90e173a77b3d8a466208da366decf2caf199104e3468ce126cb86f4d2b8fdc3066795c8e699c41b8bc61b3475ab23d61ffc02c8ae582b75bf
@@ -5,48 +5,41 @@ on: [push, pull_request]
5
5
  jobs:
6
6
  test:
7
7
  runs-on: ubuntu-20.04
8
+ services:
9
+ postgres:
10
+ image: postgres:9.5
11
+ env:
12
+ POSTGRES_USER: postgres
13
+ POSTGRES_PASSWORD: postgres
14
+ ports:
15
+ - 5432:5432
16
+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
17
+ mysql:
18
+ image: mysql:5.7
19
+ env:
20
+ MYSQL_ALLOW_EMPTY_PASSWORD: yes
21
+ ports:
22
+ - 3306:3306
23
+ options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10
8
24
  strategy:
9
25
  fail-fast: false
10
26
  matrix:
11
- ruby: [2.3, 2.4, 2.5, 2.6, 2.7, '3.0', 3.1]
12
- gemfile: ['rails50', 'rails51', 'rails52', 'rails60', 'rails61', 'rails70']
13
- exclude:
14
- - ruby: 2.3
15
- gemfile: rails60
16
- - ruby: 2.3
17
- gemfile: rails61
18
- - ruby: 2.3
19
- gemfile: rails70
20
- - ruby: 2.4
21
- gemfile: rails60
22
- - ruby: 2.4
23
- gemfile: rails61
24
- - ruby: 2.4
25
- gemfile: rails70
26
- - ruby: 2.5
27
- gemfile: rails70
28
- - ruby: 2.6
29
- gemfile: rails70
30
- - ruby: 3.0
31
- gemfile: rails50
32
- - ruby: 3.0
33
- gemfile: rails51
34
- - ruby: 3.0
35
- gemfile: rails52
36
- - ruby: 3.1
37
- gemfile: rails50
38
- - ruby: 3.1
39
- gemfile: rails51
40
- - ruby: 3.1
41
- gemfile: rails52
27
+ ruby: [2.7, '3.0', 3.1, 3.2]
28
+ gemfile: ['rails60', 'rails61', 'rails70']
29
+ database: ['postgresql', 'mysql']
30
+ database_config: ['default', 'multi']
42
31
 
43
- name: ruby ${{ matrix.ruby }}, ${{ matrix.gemfile }}
32
+ name: ruby ${{ matrix.ruby }}, ${{ matrix.gemfile }}, ${{ matrix.database }}
44
33
 
45
34
  env:
35
+ POSTGRES_USER: postgres
36
+ POSTGRES_PASSWORD: postgres
37
+ DATABASE: ${{ matrix.database }}
38
+ DATABASE_CONFIG: ${{ matrix.database_config }}
46
39
  BUNDLE_GEMFILE: gemfiles/${{ matrix.gemfile }}.gemfile
47
40
 
48
41
  steps:
49
- - uses: actions/checkout@v2
42
+ - uses: actions/checkout@v3
50
43
  - uses: ruby/setup-ruby@v1
51
44
  with:
52
45
  ruby-version: ${{ matrix.ruby }}
@@ -54,8 +47,12 @@ jobs:
54
47
  - name: Prepare test
55
48
  run: |
56
49
  cd spec/dummy
57
- BUNDLE_GEMFILE=../../${{ env.BUNDLE_GEMFILE }} RAILS_ENV=test bundle exec rake dbs:migrate
50
+ BUNDLE_GEMFILE=../../${{ env.BUNDLE_GEMFILE }} RAILS_ENV=test bundle exec rake db:create db:migrate
58
51
  cd ../..
59
52
  - name: Run test
60
53
  run: |
61
54
  bundle exec rspec
55
+ - name: Show log
56
+ run: |
57
+ cat spec/dummy/log/test.log
58
+ if: ${{ failure() }}
data/.gitignore CHANGED
@@ -1,11 +1,9 @@
1
1
  /.bundle/
2
- /.project
3
2
  /Gemfile.lock
4
3
  /gemfiles/*gemfile.lock
5
4
  /coverage/
6
5
  /pkg/
7
6
  /spec/reports/
8
- /spec/**/db/*.sqlite3
9
7
  /spec/**/log/*.log
10
8
  /spec/**/tmp/*
11
9
  /vendor/
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 3.0.0
4
+
5
+ * Add multithread feature for workers.
6
+ * Add graceful stop feature by WINCH signal.
7
+ * Add command line options.
8
+ * Add listen/notify feature for postgresql.
9
+ * Support multiple callbacks.
10
+ * Separate waitpid thread and job checker thread.
11
+ * Rename some configurations (`worker.count` to `worker.max_processes`, `monitor_wait` to `monitor_interval`).
12
+ * Use LIMIT query instead of COUNT query for finding jobs.
13
+ * Patch default SQL of delayed_job for postgresql.
14
+ * Drop support for ruby < 2.7 and rails < 6.0.
15
+
3
16
  ## 2.0.3
4
17
 
5
18
  * Fix database config detection for rails 7.0.
data/README.md CHANGED
@@ -4,26 +4,26 @@ A simple delayed_job master process to control multiple workers.
4
4
 
5
5
  ## Features
6
6
 
7
- * Preload application and fork workers fastly.
8
- * Monitor job queues and fork new workers on demand.
9
- * Trap signals to restart / reopen log files.
10
- * Support multiple databases.
7
+ * Support concurrent workers with multiprocess and multithread.
8
+ * Preload application and fork worker processes on demand.
9
+ * Check memory usage after processing a job to kill workers consuming large memory.
10
+ * Support signals for restarting master process / reopening log files.
11
+ * Check new jobs by polling multiple databases having delayed_jobs table.
12
+ * Detect new jobs quickly by using listen/notify feature. (only postgresql)
11
13
 
12
14
  ## Dependencies
13
15
 
14
- * ruby 2.3+
16
+ * ruby 2.7+
17
+ * activesupport 6.0+
15
18
  * delayed_job 4.1
16
-
17
- ## Supported delayed_job backends
18
-
19
- * delayed_job_active_record 4.1
19
+ * delayed_job_active_record 4.1 (execlude sqlite)
20
20
 
21
21
  ## Installation
22
22
 
23
23
  Add this line to your application's Gemfile:
24
24
 
25
25
  ```ruby
26
- gem 'delayed_job_master', require: false
26
+ gem 'delayed_job_master'
27
27
  ```
28
28
 
29
29
  And then execute:
@@ -36,7 +36,7 @@ Generate `bin/delayed_job_master` and `config/delayed_job_master.rb`:
36
36
 
37
37
  $ rails generate delayed_job_master:config
38
38
 
39
- ## Configuration
39
+ ## Configurations
40
40
 
41
41
  Edit `config/delayed_job_master.rb`:
42
42
 
@@ -44,8 +44,11 @@ Edit `config/delayed_job_master.rb`:
44
44
  # working directory
45
45
  working_directory Dir.pwd
46
46
 
47
- # monitor wait time in second
48
- monitor_wait 5
47
+ # monitor interval for events (in seconds)
48
+ monitor_interval 5
49
+
50
+ # polling interval for new jobs (in seconds)
51
+ polling_interval 5
49
52
 
50
53
  # path to pid file
51
54
  pid_file "#{Dir.pwd}/tmp/pids/delayed_job_master.pid"
@@ -56,16 +59,19 @@ log_file "#{Dir.pwd}/log/delayed_job_master.log"
56
59
  # log level
57
60
  log_level :info
58
61
 
59
- # databases for checking queued jobs if you have multiple databases
60
- # databases [:production]
62
+ # databases for checking new jobs in case multiple databases
63
+ # databases [:primary, :secondary]
61
64
 
62
65
  # worker1
63
66
  add_worker do |worker|
64
67
  # queue name for the worker
65
68
  worker.queues %w(queue1)
66
69
 
67
- # worker count
68
- worker.count 1
70
+ # max process count
71
+ worker.max_processes 1
72
+
73
+ # max thread count for each worker
74
+ worker.max_threads 1
69
75
 
70
76
  # max memory in MB
71
77
  worker.max_memory 300
@@ -83,22 +89,27 @@ end
83
89
  # worker2
84
90
  add_worker do |worker|
85
91
  worker.queues %w(queue2)
86
- worker.count 2
92
+ worker.max_processes 2
93
+ worker.max_threads 2
87
94
  end
88
95
 
89
96
  before_fork do |master, worker|
90
- Delayed::Worker.before_fork if defined?(Delayed::Worker)
97
+ ActiveRecord::Base.connection.disconnect!
91
98
  end
92
99
 
93
100
  after_fork do |master, worker|
94
- Delayed::Worker.after_fork if defined?(Delayed::Worker)
101
+ ActiveRecord::Base.establish_connection
95
102
  end
103
+ ```
96
104
 
97
- before_monitor do |master|
98
- ActiveRecord::Base.connection.verify! if defined?(ActiveRecord::Base)
99
- end
105
+ ### Listen/notify
106
+
107
+ Listen/notify feature is enabled by default if `pg` gem is detected.
108
+ To disable this feature, put `config/initializers/delayed_job_master.rb` as follows:
100
109
 
101
- after_monitor do |master|
110
+ ```ruby
111
+ DelayedJobMaster.configure do |config|
112
+ config.listener = nil
102
113
  end
103
114
  ```
104
115
 
@@ -113,11 +124,15 @@ Command line options:
113
124
  * -c, --config: Specify configuration file.
114
125
  * -D, --daemon: Start master as a daemon.
115
126
 
116
- Stop master and workers gracefully:
127
+ Stop master immediately, stop workers gracefully:
117
128
 
118
129
  $ kill -TERM `cat tmp/pids/delayed_job_master.pid`
119
130
 
120
- Stop master and workers forcefully:
131
+ Stop master and workers gracefully:
132
+
133
+ $ kill -WINCH `cat tmp/pids/delayed_job_master.pid`
134
+
135
+ Stop master and workers immediately:
121
136
 
122
137
  $ kill -QUIT `cat tmp/pids/delayed_job_master.pid`
123
138
 
@@ -125,31 +140,30 @@ Reopen log files:
125
140
 
126
141
  $ kill -USR1 `cat tmp/pids/delayed_job_master.pid`
127
142
 
128
- Restart gracefully:
143
+ Restart master immediately, stop workers gracefully:
129
144
 
130
145
  $ kill -USR2 `cat tmp/pids/delayed_job_master.pid`
131
146
 
132
147
  Workers handle each signal as follows:
133
148
 
134
- * TERM: Workers stop after finishing current jobs.
149
+ * TERM/WINCH/USR2: Workers stop after finishing current jobs.
135
150
  * QUIT: Workers are killed immediately.
136
151
  * USR1: Workers reopen log files.
137
- * USR2: New workers start, old workers stop after finishing current jobs.
138
152
 
139
- ## Worker status
153
+ ### Worker status
140
154
 
141
155
  `ps` command shows worker status as follows:
142
156
 
143
157
  ```
144
158
  $ ps aux
145
- ... delayed_job.0: worker[0] (queue1) [BUSY] # BUSY process is currently proceeding some jobs
159
+ ... delayed_job: worker[0] (queue1) [BUSY] # BUSY process is currently proceeding some jobs
146
160
  ```
147
161
 
148
162
  After graceful restart, you may find OLD process.
149
163
 
150
164
  ```
151
165
  $ ps aux
152
- ... delayed_job.0: worker[0] (queue1) [BUSY] [OLD] # OLD process will stop after finishing current jobs.
166
+ ... delayed_job: worker[0] (queue1) [BUSY] [OLD] # OLD process will stop after finishing current jobs.
153
167
  ```
154
168
 
155
169
  ## Contributing
@@ -159,4 +173,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/kanety
159
173
  ## License
160
174
 
161
175
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
162
-
@@ -1,11 +1,11 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'delayed/master/version'
4
+ require 'delayed_job_master/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "delayed_job_master"
8
- spec.version = Delayed::Master::VERSION
8
+ spec.version = DelayedJobMaster::VERSION
9
9
  spec.authors = ["Yoshikazu Kaneta"]
10
10
  spec.email = ["kaneta@sitebridge.co.jp"]
11
11
  spec.summary = %q{A simple delayed_job master process to control multiple workers}
@@ -18,15 +18,18 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.required_ruby_version = '>= 2.3'
21
+ spec.required_ruby_version = '>= 2.7'
22
22
 
23
23
  spec.add_dependency "delayed_job", ">= 4.1"
24
24
  spec.add_dependency "get_process_mem"
25
+ spec.add_dependency "activesupport", ">= 6.0"
25
26
 
26
- spec.add_development_dependency "rails"
27
+ spec.add_development_dependency "rails", ">= 6.0"
27
28
  spec.add_development_dependency "rake"
28
29
  spec.add_development_dependency "rspec-rails"
29
30
  spec.add_development_dependency "simplecov"
30
- spec.add_development_dependency "sqlite3"
31
+ spec.add_development_dependency "pg"
32
+ spec.add_development_dependency "mysql2"
31
33
  spec.add_development_dependency "delayed_job_active_record", ">= 4.1"
34
+ spec.add_development_dependency "delayed_job_bulk", ">= 1.0.0"
32
35
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Delayed
4
+ module Master
5
+ class Callbacks
6
+ def initialize(config)
7
+ @config = config
8
+ end
9
+
10
+ def call(event, *args, &block)
11
+ run(:"before_#{event}", *args)
12
+ result = run(:"around_#{event}", *args, &block)
13
+ run(:"after_#{event}", *args)
14
+ result
15
+ end
16
+
17
+ def run(name, *args, &block)
18
+ callbacks = get_callbacks(name)
19
+ if block
20
+ callbacks.reverse.reduce(block) { |ret, c| -> { c.call(*args, &ret) } }.call
21
+ else
22
+ callbacks.each { |c| c.call(*args) }
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def get_callbacks(name)
29
+ if @config.respond_to?(name)
30
+ @config.send(name).to_a
31
+ else
32
+ []
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,8 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'optparse'
2
4
  require_relative 'config'
3
5
 
4
6
  module Delayed
5
- class Master
7
+ module Master
6
8
  class Command
7
9
  attr_reader :config
8
10
 
@@ -11,7 +13,7 @@ module Delayed
11
13
 
12
14
  OptionParser.new { |opt|
13
15
  opt.banner = <<-EOS
14
- #{File.basename($PROGRAM_NAME)} #{Delayed::Master::VERSION}
16
+ #{File.basename($PROGRAM_NAME)} #{DelayedJobMaster::VERSION}
15
17
  Usage: #{File.basename($PROGRAM_NAME)} [options]
16
18
  EOS
17
19
 
@@ -19,12 +21,33 @@ module Delayed
19
21
  puts opt
20
22
  exit
21
23
  end
22
- opt.on('-D', '--daemon', 'Start master as a daemon') do |boolean|
23
- @config.daemon(boolean)
24
- end
25
24
  opt.on('-c', '--config=FILE', 'Specify config file') do |file|
26
25
  @config.read(file)
27
26
  end
27
+ opt.on('-D', '--daemon', 'Start master as a daemon') do |boolean|
28
+ @config.daemon = boolean
29
+ end
30
+ opt.on('--working-directory=DIR', 'Path to working directory') do |dir|
31
+ @config.working_directory = dir
32
+ end
33
+ opt.on('--pid-file=FILE', 'Path to pid file') do |file|
34
+ @config.pid_file = file
35
+ end
36
+ opt.on('--log-file=FILE', 'Path to log file') do |file|
37
+ @config.log_file = file
38
+ end
39
+ opt.on('--log-level=LEVEL', 'Log level') do |level|
40
+ @config.log_level = level.to_sym
41
+ end
42
+ opt.on('--monitor-interval=INTERVAL', Numeric, 'Monitor interval') do |interval|
43
+ @config.monitor_interval = interval
44
+ end
45
+ opt.on('--polling-interval=INTERVAL', Numeric, 'Polling interval') do |interval|
46
+ @config.polling_interval = interval
47
+ end
48
+ opt.on('--databases=DB1,DB2', Array, 'Database spec name to check delayed_jobs table') do |databases|
49
+ @config.databases = databases.map(&:to_sym)
50
+ end
28
51
  }.parse(args)
29
52
  end
30
53
  end
@@ -1,45 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'worker_setting'
4
+
1
5
  module Delayed
2
- class Master
6
+ module Master
3
7
  class Config
4
- SIMPLE_CONFIGS = [:working_directory, :log_file, :log_level, :pid_file, :monitor_wait, :daemon, :databases]
5
- CALLBACK_CONFIGS = [:before_fork, :after_fork, :before_monitor, :after_monitor]
8
+ SIMPLE_CONFIGS = [:daemon, :working_directory, :log_file, :log_level, :pid_file,
9
+ :monitor_interval, :polling_interval, :databases]
10
+ CALLBACK_CONFIGS = [:before_fork, :after_fork,
11
+ :before_monitor, :after_monitor, :around_monitor,
12
+ :before_polling, :after_polling, :around_polling]
6
13
 
7
- attr_reader :data, :workers
14
+ attr_accessor *SIMPLE_CONFIGS
15
+ attr_accessor *CALLBACK_CONFIGS
16
+ attr_reader :workers
8
17
 
9
18
  def initialize(file = nil)
10
- @data = {}
19
+ @daemon = false
20
+ @working_directory = Dir.pwd
21
+ @pid_file = "#{@working_directory}/tmp/pids/delayed_job_master.pid"
22
+ @log_file = "#{@working_directory}/log/delayed_job_master.log"
23
+ @log_level = :info
24
+ @monitor_interval = 5
25
+ @polling_interval = 5
26
+ @databases = []
27
+ CALLBACK_CONFIGS.each do |name|
28
+ send("#{name}=", [])
29
+ end
11
30
  @workers = []
12
31
  read(file) if file
13
32
  end
14
33
 
15
- def worker_settings
16
- @workers
17
- end
18
-
19
34
  def read(file)
20
35
  instance_eval(File.read(file), file)
21
36
  end
22
37
 
23
- def add_worker
24
- worker = WorkerSetting.new(id: @workers.size, queues: [], count: 1, exit_on_complete: true)
25
- yield worker
26
- @workers << worker
27
- end
28
-
29
- def callbacks
30
- @data.select { |k, _| CALLBACK_CONFIGS.include?(k) }
38
+ def worker_settings
39
+ @workers
31
40
  end
32
41
 
33
- def run_callback(key, *args)
34
- @data[key].call(*args)
42
+ def add_worker
43
+ worker = WorkerSetting.new(id: @workers.size)
44
+ yield worker if block_given?
45
+ @workers << worker
46
+ worker
35
47
  end
36
48
 
37
49
  SIMPLE_CONFIGS.each do |key|
38
- define_method(key) do |value = nil|
39
- if !value.nil?
40
- @data[key] = value
50
+ define_method(key) do |*args|
51
+ if args.size > 0
52
+ instance_variable_set("@#{key}", args[0])
41
53
  else
42
- @data[key]
54
+ instance_variable_get("@#{key}")
43
55
  end
44
56
  end
45
57
  end
@@ -47,48 +59,29 @@ module Delayed
47
59
  CALLBACK_CONFIGS.each do |key|
48
60
  define_method(key) do |&block|
49
61
  if block
50
- @data[key] = block
62
+ instance_variable_get("@#{key}") << block
51
63
  else
52
- @data[key]
64
+ instance_variable_get("@#{key}")
53
65
  end
54
66
  end
55
67
  end
56
68
 
57
- class WorkerSetting
58
- SIMPLE_CONFIGS = [:id, :count, :max_memory,
59
- :min_priority, :max_priority, :sleep_delay, :read_ahead, :exit_on_complete,
60
- :max_attempts, :max_run_time, :destroy_failed_jobs]
61
- ARRAY_CONFIGS = [:queues]
62
-
63
- attr_reader :data
64
-
65
- def initialize(default = {})
66
- @data = default
67
- end
68
-
69
- def control(value = nil)
70
- puts "DEPRECATION WARNING: deprecated control setting is called from #{caller(1, 1).first}. Remove it from your config file."
71
- end
72
-
73
- SIMPLE_CONFIGS.each do |key|
74
- define_method(key) do |value = nil|
75
- if !value.nil?
76
- @data[key] = value
77
- else
78
- @data[key]
79
- end
80
- end
81
- end
69
+ def monitor_wait(value = nil)
70
+ ActiveSupport::Deprecation.warn <<-TEXT.squish
71
+ deprecated 'monitor_wait' setting was used. Use 'monitor_interval' instead."
72
+ TEXT
73
+ @monitor_interval = @polling_interval = value
74
+ end
82
75
 
83
- ARRAY_CONFIGS.each do |key|
84
- define_method(key) do |value = nil|
85
- if value
86
- @data[key] = Array(value)
87
- else
88
- @data[key]
89
- end
90
- end
76
+ def abstract_texts
77
+ texts = []
78
+ texts << "databases: #{@databases.join(', ')}" if @databases.present?
79
+ texts += @workers.map do |worker|
80
+ str = "worker[#{worker.id}]: #{worker.max_processes} processes, #{worker.max_threads} threads"
81
+ str += " (#{worker.queues.join(', ')})" if worker.queues.present?
82
+ str
91
83
  end
84
+ texts
92
85
  end
93
86
  end
94
87
  end