delayed_job_master 2.0.3 → 3.0.0

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 (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