rocketjob 3.0.5 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rocket_job/config.rb +1 -3
- data/lib/rocket_job/job.rb +1 -0
- data/lib/rocket_job/plugins/job/throttle.rb +67 -42
- data/lib/rocket_job/plugins/job/throttle_running_jobs.rb +45 -0
- data/lib/rocket_job/plugins/job/worker.rb +31 -18
- data/lib/rocket_job/plugins/state_machine.rb +20 -43
- data/lib/rocket_job/version.rb +1 -1
- data/lib/rocketjob.rb +9 -8
- data/test/plugins/job/throttle_test.rb +22 -5
- metadata +5 -5
- data/lib/rocket_job/extensions/aasm.rb +0 -72
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90895c69510bfbacc92d44ee5145106c5ab07dac
|
4
|
+
data.tar.gz: 68297e81bd9d77e56c224443558c4db24c0ba701
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bcd1137b8bdfa9fd2627c1a1d7f94bd051b9cf1868b159c5c2024932d4f12bb33d9e5151fcdf07599fc992b547717fc1b20bb1fc3a5a89b57b8d8c7b349b0b6
|
7
|
+
data.tar.gz: 07ebf671c8d45cf9e255cb079a1b31e2c26810fc4a94bcde1758d4b51b9e41ff8760e94e0f2a473c94d471a3723fb0e3a19ec65045ced24aa4c09c476a767263
|
data/lib/rocket_job/config.rb
CHANGED
@@ -15,9 +15,7 @@ module RocketJob
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
#
|
19
|
-
# When enabled all calls to `perform_later` will be redirected to `perform_now`.
|
20
|
-
# Also, exceptions will be raised instead of failing the job.
|
18
|
+
# DEPRECATED
|
21
19
|
cattr_accessor(:inline_mode) { false }
|
22
20
|
|
23
21
|
store_in collection: 'rocket_job.configs'
|
data/lib/rocket_job/job.rb
CHANGED
@@ -3,71 +3,96 @@ require 'active_support/concern'
|
|
3
3
|
module RocketJob
|
4
4
|
module Plugins
|
5
5
|
module Job
|
6
|
-
#
|
6
|
+
# Rocket Job Throttling Framework.
|
7
7
|
#
|
8
8
|
# Example:
|
9
|
+
# # Do not run this job when the MySQL slave delay exceeds 5 minutes.
|
9
10
|
# class MyJob < RocketJob
|
10
|
-
# #
|
11
|
-
#
|
11
|
+
# # Define a custom mysql throttle
|
12
|
+
# # Prevents all jobs of this class from running on the current server.
|
13
|
+
# define_throttle :mysql_throttle_exceeded?
|
12
14
|
#
|
13
15
|
# def perform
|
14
16
|
# # ....
|
15
17
|
# end
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# Notes:
|
19
|
-
# - The actual number will be around this value, it con go over slightly and
|
20
|
-
# can drop depending on check interval can drop slightly below this value.
|
21
|
-
# - By avoid hard locks and counters performance can be maintained while still
|
22
|
-
# supporting good enough throttling.
|
23
|
-
# - If throughput is not as important as preventing brief spikes when many
|
24
|
-
# workers are running, add a double check into the perform:
|
25
|
-
# class MyJob < RocketJob
|
26
|
-
# self.throttle_running_jobs = 25
|
27
18
|
#
|
28
|
-
#
|
29
|
-
# # (Optional) Prevent a brief spike from exceeding the wax worker throttle
|
30
|
-
# self.class.throttle_double_check
|
19
|
+
# private
|
31
20
|
#
|
32
|
-
#
|
33
|
-
#
|
21
|
+
# # Returns true if the MySQL slave delay exceeds 5 minutes
|
22
|
+
# def mysql_throttle_exceeded?
|
23
|
+
# status = ActiveRecord::Base.connection.select_one('show slave status')
|
24
|
+
# seconds_delay = Hash(status)['Seconds_Behind_Master'].to_i
|
25
|
+
# seconds_delay >= 300
|
34
26
|
# end
|
27
|
+
# end
|
35
28
|
module Throttle
|
36
29
|
extend ActiveSupport::Concern
|
37
30
|
|
38
31
|
included do
|
39
|
-
class_attribute :
|
40
|
-
self.
|
32
|
+
class_attribute :rocket_job_throttles
|
33
|
+
self.rocket_job_throttles = []
|
41
34
|
end
|
42
35
|
|
43
|
-
|
44
|
-
|
45
|
-
|
36
|
+
module ClassMethods
|
37
|
+
# Add a new throttle.
|
38
|
+
#
|
39
|
+
# Parameters:
|
40
|
+
# method_name: [Symbol]
|
41
|
+
# Name of method to call to evaluate whether a throttle has been exceeded.
|
42
|
+
# Note: Must return true or false.
|
43
|
+
# filter: [Symbol|Proc]
|
44
|
+
# Name of method to call to return the filter when the throttle has been exceeded.
|
45
|
+
# Or, a block that will return the filter.
|
46
|
+
# Default: :throttle_filter_class (Throttle all jobs of this class)
|
47
|
+
#
|
48
|
+
# Note: Throttles are executed in the order they are defined.
|
49
|
+
def define_throttle(method_name, filter: :throttle_filter_class)
|
50
|
+
raise(ArgumentError, "Filter for #{method_name} must be a Symbol or Proc") unless filter.is_a?(Symbol) || filter.is_a?(Proc)
|
51
|
+
raise(ArgumentError, "Cannot define #{method_name} twice, undefine previous throttle first") if has_throttle?(method_name)
|
52
|
+
|
53
|
+
self.rocket_job_throttles += [ThrottleDefinition.new(method_name, filter)]
|
54
|
+
end
|
55
|
+
|
56
|
+
# Undefine a previously defined throttle
|
57
|
+
def undefine_throttle(method_name)
|
58
|
+
rocket_job_throttles.delete_if { |throttle| throttle.method_name }
|
59
|
+
end
|
60
|
+
|
61
|
+
# Has a throttle been defined?
|
62
|
+
def has_throttle?(method_name)
|
63
|
+
rocket_job_throttles.find { |throttle| throttle.method_name == method_name }
|
64
|
+
end
|
46
65
|
end
|
47
66
|
|
48
|
-
#
|
49
|
-
|
50
|
-
|
67
|
+
# Default throttle to use when the throttle is exceeded.
|
68
|
+
# When the throttle has been exceeded all jobs of this class will be ignored until the
|
69
|
+
# next refresh. `RocketJob::Config::re_check_seconds` which by default is 60 seconds.
|
70
|
+
def throttle_filter_class
|
71
|
+
{:_type.nin => [self.class.name]}
|
51
72
|
end
|
52
73
|
|
53
|
-
#
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
74
|
+
# Filter out only this instance of the job.
|
75
|
+
# When the throttle has been exceeded this job will be ignored by this server until the next refresh.
|
76
|
+
# `RocketJob::Config::re_check_seconds` which by default is 60 seconds.
|
77
|
+
def throttle_filter_id
|
78
|
+
{:id.nin => [id]}
|
58
79
|
end
|
59
80
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
81
|
+
private
|
82
|
+
|
83
|
+
ThrottleDefinition = Struct.new(:method_name, :filter)
|
84
|
+
|
85
|
+
# Returns the matching filter, or nil if no throttles were triggered.
|
86
|
+
def rocket_job_evaluate_throttles
|
87
|
+
rocket_job_throttles.each do |throttle|
|
88
|
+
# Throttle exceeded?
|
89
|
+
if send(throttle.method_name)
|
90
|
+
logger.debug { "Throttle: #{throttle.method_name} has been exceeded. #{self.class.name}:#{id}" }
|
91
|
+
filter = throttle.filter
|
92
|
+
return filter.is_a?(Proc) ? filter.call(self) : send(filter)
|
93
|
+
end
|
69
94
|
end
|
70
|
-
|
95
|
+
nil
|
71
96
|
end
|
72
97
|
|
73
98
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module RocketJob
|
4
|
+
module Plugins
|
5
|
+
module Job
|
6
|
+
# Throttle the number of jobs of a specific class that are processed at the same time.
|
7
|
+
#
|
8
|
+
# Example:
|
9
|
+
# class MyJob < RocketJob
|
10
|
+
# # Maximum number of jobs of this class to process at the same time.
|
11
|
+
# self.throttle_running_jobs = 25
|
12
|
+
#
|
13
|
+
# def perform
|
14
|
+
# # ....
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# Notes:
|
19
|
+
# - The actual number will be around this value, it can go over slightly and
|
20
|
+
# can drop depending on check interval can drop slightly below this value.
|
21
|
+
# - By avoiding hard locks and counters performance can be maintained while still
|
22
|
+
# supporting good enough quantity throttling.
|
23
|
+
module ThrottleRunningJobs
|
24
|
+
extend ActiveSupport::Concern
|
25
|
+
|
26
|
+
included do
|
27
|
+
# Limit number of jobs running of this class.
|
28
|
+
class_attribute :throttle_running_jobs
|
29
|
+
self.throttle_running_jobs = nil
|
30
|
+
|
31
|
+
define_throttle :throttle_running_jobs_exceeded?
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
# Returns [Boolean] whether the throttle for this job has been exceeded
|
37
|
+
def throttle_running_jobs_exceeded?
|
38
|
+
throttle_running_jobs &&
|
39
|
+
(throttle_running_jobs != 0) &&
|
40
|
+
(self.class.running.where(:id.ne => id).count >= throttle_running_jobs)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -8,25 +8,14 @@ module RocketJob
|
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
10
|
module ClassMethods
|
11
|
-
# Run this job later
|
12
|
-
#
|
13
|
-
# Saves it to the database for processing later by workers
|
14
|
-
def perform_later(args, &block)
|
15
|
-
if RocketJob::Config.inline_mode
|
16
|
-
perform_now(args, &block)
|
17
|
-
else
|
18
|
-
job = new(args)
|
19
|
-
block.call(job) if block
|
20
|
-
job.save!
|
21
|
-
job
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
11
|
# Run this job now.
|
26
12
|
#
|
27
13
|
# The job is not saved to the database since it is processed entriely in memory
|
28
14
|
# As a result before_save and before_destroy callbacks will not be called.
|
29
15
|
# Validations are still called however prior to calling #perform
|
16
|
+
#
|
17
|
+
# Note:
|
18
|
+
# - Only batch throttles are checked when perform_now is called.
|
30
19
|
def perform_now(args, &block)
|
31
20
|
job = new(args)
|
32
21
|
block.call(job) if block
|
@@ -56,10 +45,8 @@ module RocketJob
|
|
56
45
|
when job.expired?
|
57
46
|
job.rocket_job_fail_on_exception!(worker_name) { job.destroy }
|
58
47
|
logger.info "Destroyed expired job #{job.class.name}, id:#{job.id}"
|
59
|
-
when job.
|
60
|
-
|
61
|
-
# Add jobs filter to the current filter
|
62
|
-
job.throttle_merge_filter(filter, job.throttle_filter)
|
48
|
+
when new_filter = job.send(:rocket_job_evaluate_throttles)
|
49
|
+
rocket_job_merge_filter(filter, new_filter)
|
63
50
|
# Restore retrieved job so that other workers can process it later
|
64
51
|
job.set(worker_name: nil, state: :queued)
|
65
52
|
else
|
@@ -79,6 +66,32 @@ module RocketJob
|
|
79
66
|
job.requeue!(server_name) if job.may_requeue?(server_name)
|
80
67
|
end
|
81
68
|
end
|
69
|
+
|
70
|
+
# DEPRECATED
|
71
|
+
def perform_later(args, &block)
|
72
|
+
if RocketJob::Config.inline_mode
|
73
|
+
perform_now(args, &block)
|
74
|
+
else
|
75
|
+
job = new(args)
|
76
|
+
block.call(job) if block
|
77
|
+
job.save!
|
78
|
+
job
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def rocket_job_merge_filter(target, source)
|
85
|
+
source.each_pair do |k, v|
|
86
|
+
target[k] =
|
87
|
+
if previous = target[k]
|
88
|
+
v.is_a?(Array) ? previous + v : v
|
89
|
+
else
|
90
|
+
v
|
91
|
+
end
|
92
|
+
end
|
93
|
+
target
|
94
|
+
end
|
82
95
|
end
|
83
96
|
|
84
97
|
# Runs the job now in the current thread.
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'thread'
|
2
2
|
require 'active_support/concern'
|
3
3
|
require 'aasm'
|
4
|
-
require 'rocket_job/extensions/aasm'
|
5
4
|
|
6
5
|
module RocketJob
|
7
6
|
module Plugins
|
@@ -28,14 +27,9 @@ module RocketJob
|
|
28
27
|
# end
|
29
28
|
module StateMachine
|
30
29
|
extend ActiveSupport::Concern
|
31
|
-
@@aasm_mutex = Mutex.new
|
32
30
|
|
33
31
|
included do
|
34
32
|
include AASM
|
35
|
-
# Try to make aasm lookup thread safe
|
36
|
-
@aasm = Concurrent::Map.new
|
37
|
-
# Call aasm to create default instance upfront
|
38
|
-
aasm
|
39
33
|
|
40
34
|
# Adds a :before or :after callback to an event
|
41
35
|
# state_machine_add_event_callback(:start, :before, :my_method)
|
@@ -43,30 +37,28 @@ module RocketJob
|
|
43
37
|
raise(ArgumentError, 'Cannot supply both a method name and a block') if (methods.size > 0) && block
|
44
38
|
raise(ArgumentError, 'Must supply either a method name or a block') unless (methods.size > 0) || block
|
45
39
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
raise(ArgumentError, "#{action}_#{event_name} currently does not support any options. Only Symbol and String method names can be supplied.")
|
61
|
-
end
|
40
|
+
# TODO Somehow get AASM to support options such as :if and :unless to be consistent with other callbacks
|
41
|
+
# For example:
|
42
|
+
# before_start :my_callback, unless: :encrypted?
|
43
|
+
# before_start :my_callback, if: :encrypted?
|
44
|
+
if event = aasm.state_machine.events[event_name]
|
45
|
+
values = Array(event.options[action])
|
46
|
+
code =
|
47
|
+
if block
|
48
|
+
block
|
49
|
+
else
|
50
|
+
# Validate methods are any of Symbol String Proc
|
51
|
+
methods.each do |method|
|
52
|
+
unless method.is_a?(Symbol) || method.is_a?(String)
|
53
|
+
raise(ArgumentError, "#{action}_#{event_name} currently does not support any options. Only Symbol and String method names can be supplied.")
|
62
54
|
end
|
63
|
-
methods
|
64
55
|
end
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
56
|
+
methods
|
57
|
+
end
|
58
|
+
action == :before ? values.push(code) : values.unshift(code)
|
59
|
+
event.options[action] = values.flatten.uniq
|
60
|
+
else
|
61
|
+
raise(ArgumentError, "Unknown event: #{event_name.inspect}")
|
70
62
|
end
|
71
63
|
end
|
72
64
|
|
@@ -84,21 +76,6 @@ module RocketJob
|
|
84
76
|
end
|
85
77
|
end
|
86
78
|
|
87
|
-
# Patch AASM so that save! is called instead of save
|
88
|
-
# So that validations are run before job.requeue! is completed
|
89
|
-
# Otherwise it just fails silently
|
90
|
-
def aasm_write_state(state, name=:default)
|
91
|
-
attr_name = self.class.aasm(name).attribute_name
|
92
|
-
old_value = read_attribute(attr_name)
|
93
|
-
write_attribute(attr_name, state)
|
94
|
-
|
95
|
-
begin
|
96
|
-
save!
|
97
|
-
rescue Exception => exc
|
98
|
-
write_attribute(attr_name, old_value)
|
99
|
-
raise(exc)
|
100
|
-
end
|
101
|
-
end
|
102
79
|
end
|
103
80
|
|
104
81
|
end
|
data/lib/rocket_job/version.rb
CHANGED
data/lib/rocketjob.rb
CHANGED
@@ -18,14 +18,15 @@ module RocketJob
|
|
18
18
|
|
19
19
|
module Plugins
|
20
20
|
module Job
|
21
|
-
autoload :Callbacks,
|
22
|
-
autoload :Defaults,
|
23
|
-
autoload :StateMachine,
|
24
|
-
autoload :Logger,
|
25
|
-
autoload :Model,
|
26
|
-
autoload :Persistence,
|
27
|
-
autoload :Throttle,
|
28
|
-
autoload :
|
21
|
+
autoload :Callbacks, 'rocket_job/plugins/job/callbacks'
|
22
|
+
autoload :Defaults, 'rocket_job/plugins/job/defaults'
|
23
|
+
autoload :StateMachine, 'rocket_job/plugins/job/state_machine'
|
24
|
+
autoload :Logger, 'rocket_job/plugins/job/logger'
|
25
|
+
autoload :Model, 'rocket_job/plugins/job/model'
|
26
|
+
autoload :Persistence, 'rocket_job/plugins/job/persistence'
|
27
|
+
autoload :Throttle, 'rocket_job/plugins/job/throttle'
|
28
|
+
autoload :ThrottleRunningJobs, 'rocket_job/plugins/job/throttle_running_jobs'
|
29
|
+
autoload :Worker, 'rocket_job/plugins/job/worker'
|
29
30
|
end
|
30
31
|
module Rufus
|
31
32
|
autoload :CronLine, 'rocket_job/plugins/rufus/cron_line'
|
@@ -19,18 +19,35 @@ module Plugins
|
|
19
19
|
RocketJob::Job.delete_all
|
20
20
|
end
|
21
21
|
|
22
|
-
describe '
|
22
|
+
describe '.has_throttle?' do
|
23
|
+
it 'defines the running jobs throttle' do
|
24
|
+
assert ThrottleJob.has_throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
25
|
+
refute ThrottleJob.has_throttle?(:blah?), ThrottleJob.rocket_job_throttles
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.undefine_throttle' do
|
30
|
+
it 'undefines the running jobs throttle' do
|
31
|
+
assert ThrottleJob.has_throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
32
|
+
ThrottleJob.undefine_throttle(:throttle_running_jobs_exceeded?)
|
33
|
+
refute ThrottleJob.has_throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
34
|
+
ThrottleJob.define_throttle(:throttle_running_jobs_exceeded?)
|
35
|
+
assert ThrottleJob.has_throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#throttle_running_jobs_exceeded??' do
|
23
40
|
it 'does not exceed throttle when no other jobs are running' do
|
24
41
|
ThrottleJob.create!
|
25
42
|
job = ThrottleJob.new
|
26
|
-
refute job.
|
43
|
+
refute job.send(:throttle_running_jobs_exceeded?)
|
27
44
|
end
|
28
45
|
|
29
46
|
it 'exceeds throttle when other jobs are running' do
|
30
47
|
job1 = ThrottleJob.new
|
31
48
|
job1.start!
|
32
49
|
job2 = ThrottleJob.new
|
33
|
-
assert job2.
|
50
|
+
assert job2.send(:throttle_running_jobs_exceeded?)
|
34
51
|
end
|
35
52
|
|
36
53
|
it 'excludes paused jobs' do
|
@@ -38,7 +55,7 @@ module Plugins
|
|
38
55
|
job1.start
|
39
56
|
job1.pause!
|
40
57
|
job2 = ThrottleJob.new
|
41
|
-
refute job2.
|
58
|
+
refute job2.send(:throttle_running_jobs_exceeded?)
|
42
59
|
end
|
43
60
|
|
44
61
|
it 'excludes failed jobs' do
|
@@ -46,7 +63,7 @@ module Plugins
|
|
46
63
|
job1.start
|
47
64
|
job1.fail!
|
48
65
|
job2 = ThrottleJob.new
|
49
|
-
refute job2.
|
66
|
+
refute job2.send(:throttle_running_jobs_exceeded?)
|
50
67
|
end
|
51
68
|
end
|
52
69
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rocketjob
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '4.
|
61
|
+
version: '4.12'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '4.
|
68
|
+
version: '4.12'
|
69
69
|
description:
|
70
70
|
email:
|
71
71
|
- support@rocketjob.io
|
@@ -84,7 +84,6 @@ files:
|
|
84
84
|
- lib/rocket_job/cli.rb
|
85
85
|
- lib/rocket_job/config.rb
|
86
86
|
- lib/rocket_job/dirmon_entry.rb
|
87
|
-
- lib/rocket_job/extensions/aasm.rb
|
88
87
|
- lib/rocket_job/extensions/mongo/logging.rb
|
89
88
|
- lib/rocket_job/extensions/rocket_job_adapter.rb
|
90
89
|
- lib/rocket_job/heartbeat.rb
|
@@ -102,6 +101,7 @@ files:
|
|
102
101
|
- lib/rocket_job/plugins/job/persistence.rb
|
103
102
|
- lib/rocket_job/plugins/job/state_machine.rb
|
104
103
|
- lib/rocket_job/plugins/job/throttle.rb
|
104
|
+
- lib/rocket_job/plugins/job/throttle_running_jobs.rb
|
105
105
|
- lib/rocket_job/plugins/job/worker.rb
|
106
106
|
- lib/rocket_job/plugins/processing_window.rb
|
107
107
|
- lib/rocket_job/plugins/restart.rb
|
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'aasm'
|
2
|
-
|
3
|
-
# The following patches can be removed once the following PR has been merged into AASM:
|
4
|
-
# https://github.com/aasm/aasm/pull/269
|
5
|
-
|
6
|
-
AASM::Core::Event
|
7
|
-
module AASM::Core
|
8
|
-
class Event
|
9
|
-
def initialize_copy(orig)
|
10
|
-
super
|
11
|
-
@transitions = @transitions.collect { |transition| transition.clone }
|
12
|
-
@guards = @guards.dup
|
13
|
-
@unless = @unless.dup
|
14
|
-
@options = {}
|
15
|
-
orig.options.each_pair { |name, setting| @options[name] = setting.is_a?(Hash) || setting.is_a?(Array) ? setting.dup : setting }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
AASM::Core::State
|
21
|
-
module AASM::Core
|
22
|
-
class State
|
23
|
-
# called internally by Ruby 1.9 after clone()
|
24
|
-
def initialize_copy(orig)
|
25
|
-
super
|
26
|
-
@options = {}
|
27
|
-
orig.options.each_pair { |name, setting| @options[name] = setting.is_a?(Hash) || setting.is_a?(Array) ? setting.dup : setting }
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
AASM::Core::Transition
|
33
|
-
module AASM::Core
|
34
|
-
class Transition
|
35
|
-
def initialize_copy(orig)
|
36
|
-
super
|
37
|
-
@guards = @guards.dup
|
38
|
-
@unless = @unless.dup
|
39
|
-
@opts = {}
|
40
|
-
orig.opts.each_pair { |name, setting| @opts[name] = setting.is_a?(Hash) || setting.is_a?(Array) ? setting.dup : setting }
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
AASM::StateMachine
|
46
|
-
module AASM
|
47
|
-
class StateMachine
|
48
|
-
def initialize_copy(orig)
|
49
|
-
super
|
50
|
-
@states = orig.states.collect { |state| state.clone }
|
51
|
-
@events = {}
|
52
|
-
orig.events.each_pair { |name, event| @events[name] = event.clone }
|
53
|
-
@global_callbacks = @global_callbacks.dup
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Patch to try and make AASM threadsafe
|
59
|
-
AASM::StateMachineStore
|
60
|
-
module AASM
|
61
|
-
class StateMachineStore
|
62
|
-
@stores = Concurrent::Map.new
|
63
|
-
|
64
|
-
def self.stores
|
65
|
-
@stores
|
66
|
-
end
|
67
|
-
|
68
|
-
def initialize
|
69
|
-
@machines = Concurrent::Map.new
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|