good_job 1.3.4 → 1.5.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.
@@ -19,6 +19,9 @@ module GoodJob # :nodoc:
19
19
  # @return [array<GoodJob:Poller>]
20
20
  cattr_reader :instances, default: [], instance_reader: false
21
21
 
22
+ # Creates GoodJob::Poller from a GoodJob::Configuration instance.
23
+ # @param configuration [GoodJob::Configuration]
24
+ # @return [GoodJob::Poller]
22
25
  def self.from_configuration(configuration)
23
26
  GoodJob::Poller.new(poll_interval: configuration.poll_interval)
24
27
  end
@@ -1,8 +1,12 @@
1
1
  module GoodJob
2
2
  # Ruby on Rails integration.
3
3
  class Railtie < ::Rails::Railtie
4
- initializer "good_job.logger" do
5
- ActiveSupport.on_load(:good_job) { self.logger = ::Rails.logger }
4
+ config.good_job = ActiveSupport::OrderedOptions.new
5
+
6
+ initializer "good_job.logger" do |_app|
7
+ ActiveSupport.on_load(:good_job) do
8
+ self.logger = ::Rails.logger
9
+ end
6
10
  GoodJob::LogSubscriber.attach_to :good_job
7
11
  end
8
12
 
@@ -22,7 +22,7 @@ module GoodJob # :nodoc:
22
22
  max_threads: Configuration::DEFAULT_MAX_THREADS,
23
23
  auto_terminate: true,
24
24
  idletime: 60,
25
- max_queue: -1,
25
+ max_queue: 0,
26
26
  fallback_policy: :discard,
27
27
  }.freeze
28
28
 
@@ -40,19 +40,7 @@ module GoodJob # :nodoc:
40
40
  queue_string, max_threads = queue_string_and_max_threads.split(':')
41
41
  max_threads = (max_threads || configuration.max_threads).to_i
42
42
 
43
- job_query = GoodJob::Job.queue_string(queue_string)
44
- parsed = GoodJob::Job.queue_parser(queue_string)
45
- job_filter = proc do |state|
46
- if parsed[:exclude]
47
- parsed[:exclude].exclude?(state[:queue_name])
48
- elsif parsed[:include]
49
- parsed[:include].include? state[:queue_name]
50
- else
51
- true
52
- end
53
- end
54
- job_performer = GoodJob::Performer.new(job_query, :perform_with_advisory_lock, name: queue_string, filter: job_filter)
55
-
43
+ job_performer = GoodJob::JobPerformer.new(queue_string)
56
44
  GoodJob::Scheduler.new(job_performer, max_threads: max_threads)
57
45
  end
58
46
 
@@ -63,7 +51,7 @@ module GoodJob # :nodoc:
63
51
  end
64
52
  end
65
53
 
66
- # @param performer [GoodJob::Performer]
54
+ # @param performer [GoodJob::JobPerformer]
67
55
  # @param max_threads [Numeric, nil] number of seconds between polls for jobs
68
56
  def initialize(performer, max_threads: nil)
69
57
  raise ArgumentError, "Performer argument must implement #next" unless performer.respond_to?(:next)
@@ -170,10 +158,13 @@ module GoodJob # :nodoc:
170
158
  # @return [Integer]
171
159
  def ready_worker_count
172
160
  synchronize do
173
- workers_still_to_be_created = @max_length - @pool.length
174
- workers_created_but_waiting = @ready.length
175
-
176
- workers_still_to_be_created + workers_created_but_waiting
161
+ if Concurrent.on_jruby?
162
+ @executor.getMaximumPoolSize - @executor.getActiveCount
163
+ else
164
+ workers_still_to_be_created = @max_length - @pool.length
165
+ workers_created_but_waiting = @ready.length
166
+ workers_still_to_be_created + workers_created_but_waiting
167
+ end
177
168
  end
178
169
  end
179
170
  end
@@ -1,4 +1,4 @@
1
1
  module GoodJob
2
2
  # GoodJob gem version.
3
- VERSION = '1.3.4'.freeze
3
+ VERSION = '1.5.0'.freeze
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: good_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.4
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Sheldon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-12-02 00:00:00.000000000 Z
11
+ date: 2021-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activejob
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.0.2
55
- - !ruby/object:Gem::Dependency
56
- name: pg
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: 1.0.0
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: 1.0.0
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: railties
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -164,20 +150,6 @@ dependencies:
164
150
  - - ">="
165
151
  - !ruby/object:Gem::Version
166
152
  version: '0'
167
- - !ruby/object:Gem::Dependency
168
- name: erb_lint
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - ">="
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - ">="
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
153
  - !ruby/object:Gem::Dependency
182
154
  name: foreman
183
155
  requirement: !ruby/object:Gem::Requirement
@@ -248,20 +220,6 @@ dependencies:
248
220
  - - ">="
249
221
  - !ruby/object:Gem::Version
250
222
  version: '0'
251
- - !ruby/object:Gem::Dependency
252
- name: mdl
253
- requirement: !ruby/object:Gem::Requirement
254
- requirements:
255
- - - ">="
256
- - !ruby/object:Gem::Version
257
- version: '0'
258
- type: :development
259
- prerelease: false
260
- version_requirements: !ruby/object:Gem::Requirement
261
- requirements:
262
- - - ">="
263
- - !ruby/object:Gem::Version
264
- version: '0'
265
223
  - !ruby/object:Gem::Dependency
266
224
  name: pry-rails
267
225
  requirement: !ruby/object:Gem::Requirement
@@ -290,34 +248,6 @@ dependencies:
290
248
  - - ">="
291
249
  - !ruby/object:Gem::Version
292
250
  version: '0'
293
- - !ruby/object:Gem::Dependency
294
- name: rails
295
- requirement: !ruby/object:Gem::Requirement
296
- requirements:
297
- - - ">="
298
- - !ruby/object:Gem::Version
299
- version: '0'
300
- type: :development
301
- prerelease: false
302
- version_requirements: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - ">="
305
- - !ruby/object:Gem::Version
306
- version: '0'
307
- - !ruby/object:Gem::Dependency
308
- name: rbtrace
309
- requirement: !ruby/object:Gem::Requirement
310
- requirements:
311
- - - ">="
312
- - !ruby/object:Gem::Version
313
- version: '0'
314
- type: :development
315
- prerelease: false
316
- version_requirements: !ruby/object:Gem::Requirement
317
- requirements:
318
- - - ">="
319
- - !ruby/object:Gem::Version
320
- version: '0'
321
251
  - !ruby/object:Gem::Dependency
322
252
  name: rspec-rails
323
253
  requirement: !ruby/object:Gem::Requirement
@@ -332,62 +262,6 @@ dependencies:
332
262
  - - ">="
333
263
  - !ruby/object:Gem::Version
334
264
  version: '0'
335
- - !ruby/object:Gem::Dependency
336
- name: rubocop
337
- requirement: !ruby/object:Gem::Requirement
338
- requirements:
339
- - - ">="
340
- - !ruby/object:Gem::Version
341
- version: '0'
342
- type: :development
343
- prerelease: false
344
- version_requirements: !ruby/object:Gem::Requirement
345
- requirements:
346
- - - ">="
347
- - !ruby/object:Gem::Version
348
- version: '0'
349
- - !ruby/object:Gem::Dependency
350
- name: rubocop-performance
351
- requirement: !ruby/object:Gem::Requirement
352
- requirements:
353
- - - ">="
354
- - !ruby/object:Gem::Version
355
- version: '0'
356
- type: :development
357
- prerelease: false
358
- version_requirements: !ruby/object:Gem::Requirement
359
- requirements:
360
- - - ">="
361
- - !ruby/object:Gem::Version
362
- version: '0'
363
- - !ruby/object:Gem::Dependency
364
- name: rubocop-rails
365
- requirement: !ruby/object:Gem::Requirement
366
- requirements:
367
- - - ">="
368
- - !ruby/object:Gem::Version
369
- version: '0'
370
- type: :development
371
- prerelease: false
372
- version_requirements: !ruby/object:Gem::Requirement
373
- requirements:
374
- - - ">="
375
- - !ruby/object:Gem::Version
376
- version: '0'
377
- - !ruby/object:Gem::Dependency
378
- name: rubocop-rspec
379
- requirement: !ruby/object:Gem::Requirement
380
- requirements:
381
- - - ">="
382
- - !ruby/object:Gem::Version
383
- version: '0'
384
- type: :development
385
- prerelease: false
386
- version_requirements: !ruby/object:Gem::Requirement
387
- requirements:
388
- - - ">="
389
- - !ruby/object:Gem::Version
390
- version: '0'
391
265
  - !ruby/object:Gem::Dependency
392
266
  name: selenium-webdriver
393
267
  requirement: !ruby/object:Gem::Requirement
@@ -458,20 +332,20 @@ files:
458
332
  - CHANGELOG.md
459
333
  - LICENSE.txt
460
334
  - README.md
335
+ - engine/app/assets/style.css
336
+ - engine/app/assets/vendor/bootstrap/bootstrap-native.js
337
+ - engine/app/assets/vendor/bootstrap/bootstrap.css
338
+ - engine/app/assets/vendor/chartist/chartist.css
339
+ - engine/app/assets/vendor/chartist/chartist.js
461
340
  - engine/app/controllers/good_job/active_jobs_controller.rb
462
341
  - engine/app/controllers/good_job/base_controller.rb
463
342
  - engine/app/controllers/good_job/dashboards_controller.rb
464
343
  - engine/app/helpers/good_job/application_helper.rb
465
- - engine/app/views/assets/_style.css.erb
466
344
  - engine/app/views/good_job/active_jobs/show.html.erb
467
345
  - engine/app/views/good_job/dashboards/index.html.erb
468
346
  - engine/app/views/layouts/good_job/base.html.erb
469
347
  - engine/app/views/shared/_chart.erb
470
348
  - engine/app/views/shared/_jobs_table.erb
471
- - engine/app/views/vendor/bootstrap/_bootstrap-native.js.erb
472
- - engine/app/views/vendor/bootstrap/_bootstrap.css.erb
473
- - engine/app/views/vendor/chartist/_chartist.css.erb
474
- - engine/app/views/vendor/chartist/_chartist.js.erb
475
349
  - engine/config/routes.rb
476
350
  - engine/lib/good_job/engine.rb
477
351
  - exe/good_job
@@ -484,11 +358,11 @@ files:
484
358
  - lib/good_job/configuration.rb
485
359
  - lib/good_job/current_execution.rb
486
360
  - lib/good_job/job.rb
361
+ - lib/good_job/job_performer.rb
487
362
  - lib/good_job/lockable.rb
488
363
  - lib/good_job/log_subscriber.rb
489
364
  - lib/good_job/multi_scheduler.rb
490
365
  - lib/good_job/notifier.rb
491
- - lib/good_job/performer.rb
492
366
  - lib/good_job/poller.rb
493
367
  - lib/good_job/railtie.rb
494
368
  - lib/good_job/scheduler.rb
@@ -525,7 +399,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
525
399
  - !ruby/object:Gem::Version
526
400
  version: '0'
527
401
  requirements: []
528
- rubygems_version: 3.1.4
402
+ rubygems_version: 3.2.4
529
403
  signing_key:
530
404
  specification_version: 4
531
405
  summary: A multithreaded, Postgres-based ActiveJob backend for Ruby on Rails
@@ -1,60 +0,0 @@
1
- module GoodJob
2
- #
3
- # Performer queries the database for jobs and performs them on behalf of a
4
- # {Scheduler}. It mainly functions as glue between a {Scheduler} and the jobs
5
- # it should be executing.
6
- #
7
- # The Performer enforces a callable that does not rely on scoped/closure
8
- # variables because they might not be available when executed in a different
9
- # thread.
10
- #
11
- class Performer
12
- # @!attribute [r] name
13
- # @return [String]
14
- # a meaningful name to identify the performer in logs and for debugging.
15
- # This is usually set to the list of queues the performer will query,
16
- # e.g. +"-transactional_messages,batch_processing"+.
17
- attr_reader :name
18
-
19
- # @param target [Object]
20
- # An object that can perform jobs. It must respond to +method_name+ by
21
- # finding and performing jobs and is usually a {Job} query,
22
- # e.g. +GoodJob::Job.where(queue_name: ['queue1', 'queue2'])+.
23
- # @param method_name [Symbol]
24
- # The name of a method on +target+ that finds and performs jobs.
25
- # @param name [String]
26
- # A name for the performer to be used in logs and for debugging.
27
- # @param filter [#call]
28
- # Used to determine whether the performer should be used in GoodJob's
29
- # current state. GoodJob state is a +Hash+ that will be passed as the
30
- # first argument to +filter+ and includes info like the current queue.
31
- def initialize(target, method_name, name: nil, filter: nil)
32
- @target = target
33
- @method_name = method_name
34
- @name = name
35
- @filter = filter
36
- end
37
-
38
- # Find and perform any eligible jobs.
39
- def next
40
- @target.public_send(@method_name)
41
- end
42
-
43
- # Tests whether this performer should be used in GoodJob's current state by
44
- # calling the +filter+ callable set in {#initialize}. Always returns +true+
45
- # if there is no filter.
46
- #
47
- # For example, state will be a LISTEN/NOTIFY message that is passed down
48
- # from the Notifier to the Scheduler. The Scheduler is able to ask
49
- # its performer "does this message relate to you?", and if not, ignore it
50
- # to minimize thread wake-ups, database queries, and thundering herds.
51
- #
52
- # @return [Boolean] whether the performer's {#next} method should be
53
- # called in the current state.
54
- def next?(state = {})
55
- return true unless @filter.respond_to?(:call)
56
-
57
- @filter.call(state)
58
- end
59
- end
60
- end