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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +95 -11
- data/README.md +56 -11
- data/engine/app/{views/assets/_style.css.erb → assets/style.css} +0 -0
- data/engine/app/{views/vendor/bootstrap/_bootstrap-native.js.erb → assets/vendor/bootstrap/bootstrap-native.js} +0 -0
- data/engine/app/{views/vendor/bootstrap/_bootstrap.css.erb → assets/vendor/bootstrap/bootstrap.css} +0 -0
- data/engine/app/{views/vendor/chartist/_chartist.css.erb → assets/vendor/chartist/chartist.css} +0 -0
- data/engine/app/{views/vendor/chartist/_chartist.js.erb → assets/vendor/chartist/chartist.js} +0 -0
- data/engine/app/controllers/good_job/dashboards_controller.rb +2 -2
- data/engine/app/views/good_job/dashboards/index.html.erb +19 -7
- data/engine/app/views/layouts/good_job/base.html.erb +6 -6
- data/engine/app/views/shared/_chart.erb +1 -1
- data/engine/app/views/shared/_jobs_table.erb +27 -25
- data/lib/active_job/queue_adapters/good_job_adapter.rb +3 -3
- data/lib/good_job.rb +7 -8
- data/lib/good_job/adapter.rb +18 -15
- data/lib/good_job/configuration.rb +16 -3
- data/lib/good_job/job.rb +7 -1
- data/lib/good_job/job_performer.rb +63 -0
- data/lib/good_job/lockable.rb +56 -11
- data/lib/good_job/log_subscriber.rb +7 -7
- data/lib/good_job/notifier.rb +26 -14
- data/lib/good_job/poller.rb +3 -0
- data/lib/good_job/railtie.rb +6 -2
- data/lib/good_job/scheduler.rb +10 -19
- data/lib/good_job/version.rb +1 -1
- metadata +9 -135
- data/lib/good_job/performer.rb +0 -60
data/lib/good_job/poller.rb
CHANGED
@@ -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
|
data/lib/good_job/railtie.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
module GoodJob
|
2
2
|
# Ruby on Rails integration.
|
3
3
|
class Railtie < ::Rails::Railtie
|
4
|
-
|
5
|
-
|
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
|
|
data/lib/good_job/scheduler.rb
CHANGED
@@ -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:
|
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
|
-
|
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::
|
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
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
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
|
data/lib/good_job/version.rb
CHANGED
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.
|
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:
|
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.
|
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
|
data/lib/good_job/performer.rb
DELETED
@@ -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
|