rocketjob 3.4.3 → 3.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 +5 -5
- data/README.md +27 -0
- data/bin/rocketjob +1 -1
- data/lib/rocket_job/active_worker.rb +4 -3
- data/lib/rocket_job/cli.rb +13 -12
- data/lib/rocket_job/config.rb +17 -13
- data/lib/rocket_job/dirmon_entry.rb +88 -91
- data/lib/rocket_job/extensions/mongo/logging.rb +8 -4
- data/lib/rocket_job/extensions/mongoid/factory.rb +8 -6
- data/lib/rocket_job/extensions/rocket_job_adapter.rb +2 -4
- data/lib/rocket_job/heartbeat.rb +7 -8
- data/lib/rocket_job/job_exception.rb +6 -5
- data/lib/rocket_job/jobs/dirmon_job.rb +5 -7
- data/lib/rocket_job/jobs/housekeeping_job.rb +3 -2
- data/lib/rocket_job/jobs/on_demand_job.rb +104 -0
- data/lib/rocket_job/jobs/simple_job.rb +0 -2
- data/lib/rocket_job/jobs/upload_file_job.rb +100 -0
- data/lib/rocket_job/performance.rb +15 -10
- data/lib/rocket_job/plugins/cron.rb +7 -124
- data/lib/rocket_job/plugins/document.rb +8 -10
- data/lib/rocket_job/plugins/job/callbacks.rb +0 -1
- data/lib/rocket_job/plugins/job/logger.rb +0 -1
- data/lib/rocket_job/plugins/job/model.rb +15 -20
- data/lib/rocket_job/plugins/job/persistence.rb +3 -13
- data/lib/rocket_job/plugins/job/state_machine.rb +1 -2
- data/lib/rocket_job/plugins/job/throttle.rb +16 -12
- data/lib/rocket_job/plugins/job/worker.rb +15 -19
- data/lib/rocket_job/plugins/processing_window.rb +2 -2
- data/lib/rocket_job/plugins/restart.rb +3 -4
- data/lib/rocket_job/plugins/retry.rb +2 -3
- data/lib/rocket_job/plugins/singleton.rb +2 -3
- data/lib/rocket_job/plugins/state_machine.rb +19 -23
- data/lib/rocket_job/rocket_job.rb +4 -5
- data/lib/rocket_job/server.rb +35 -41
- data/lib/rocket_job/version.rb +2 -2
- data/lib/rocket_job/worker.rb +22 -21
- data/lib/rocketjob.rb +2 -0
- data/test/config/mongoid.yml +2 -2
- data/test/config_test.rb +0 -2
- data/test/dirmon_entry_test.rb +161 -134
- data/test/dirmon_job_test.rb +80 -78
- data/test/job_test.rb +0 -2
- data/test/jobs/housekeeping_job_test.rb +0 -1
- data/test/jobs/on_demand_job_test.rb +59 -0
- data/test/jobs/upload_file_job_test.rb +99 -0
- data/test/plugins/cron_test.rb +1 -3
- data/test/plugins/job/callbacks_test.rb +8 -13
- data/test/plugins/job/defaults_test.rb +0 -1
- data/test/plugins/job/logger_test.rb +2 -4
- data/test/plugins/job/model_test.rb +1 -2
- data/test/plugins/job/persistence_test.rb +0 -2
- data/test/plugins/job/state_machine_test.rb +0 -2
- data/test/plugins/job/throttle_test.rb +6 -8
- data/test/plugins/job/worker_test.rb +1 -2
- data/test/plugins/processing_window_test.rb +0 -2
- data/test/plugins/restart_test.rb +0 -1
- data/test/plugins/retry_test.rb +1 -2
- data/test/plugins/singleton_test.rb +0 -2
- data/test/plugins/state_machine_event_callbacks_test.rb +1 -2
- data/test/plugins/state_machine_test.rb +0 -2
- data/test/plugins/transaction_test.rb +5 -7
- data/test/test_db.sqlite3 +0 -0
- data/test/test_helper.rb +2 -1
- metadata +42 -36
data/test/job_test.rb
CHANGED
@@ -2,7 +2,6 @@ require_relative 'test_helper'
|
|
2
2
|
|
3
3
|
# Unit Test for RocketJob::Job
|
4
4
|
class JobTest < Minitest::Test
|
5
|
-
|
6
5
|
class SimpleJob < RocketJob::Job
|
7
6
|
def perform
|
8
7
|
end
|
@@ -68,6 +67,5 @@ class JobTest < Minitest::Test
|
|
68
67
|
assert_equal worker_name2, @job2.worker_name
|
69
68
|
end
|
70
69
|
end
|
71
|
-
|
72
70
|
end
|
73
71
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class OnDemandJobTest < Minitest::Test
|
4
|
+
describe RocketJob::Jobs::OnDemandJob do
|
5
|
+
before do
|
6
|
+
RocketJob::Jobs::OnDemandJob.delete_all
|
7
|
+
end
|
8
|
+
|
9
|
+
describe '#perform' do
|
10
|
+
it 'hello world' do
|
11
|
+
code = <<~CODE
|
12
|
+
logger.info 'Hello World'
|
13
|
+
CODE
|
14
|
+
|
15
|
+
job = RocketJob::Jobs::OnDemandJob.new(code: code)
|
16
|
+
job.perform_now
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'retain output' do
|
20
|
+
code = <<~CODE
|
21
|
+
{'value' => 'h' * 24}
|
22
|
+
CODE
|
23
|
+
|
24
|
+
job = RocketJob::Jobs::OnDemandJob.new(
|
25
|
+
code: code,
|
26
|
+
collect_output: true
|
27
|
+
)
|
28
|
+
job.perform_now
|
29
|
+
assert_equal 'h' * 24, job.result['value']
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'accepts input data' do
|
33
|
+
code = <<~CODE
|
34
|
+
{'value' => data['a'] * data['b']}
|
35
|
+
CODE
|
36
|
+
|
37
|
+
job = RocketJob::Jobs::OnDemandJob.new(
|
38
|
+
code: code,
|
39
|
+
collect_output: true,
|
40
|
+
data: {'a' => 10, 'b' => 2}
|
41
|
+
)
|
42
|
+
job.perform_now
|
43
|
+
assert_equal 20, job.result['value']
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'validates code' do
|
47
|
+
code = <<~CODE
|
48
|
+
def bad code
|
49
|
+
CODE
|
50
|
+
|
51
|
+
job = RocketJob::Jobs::OnDemandJob.new(code: code)
|
52
|
+
refute job.valid?
|
53
|
+
assert_raises Mongoid::Errors::Validations do
|
54
|
+
job.perform_now
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
class UploadFileJobTest < Minitest::Test
|
4
|
+
class TestJob < RocketJob::Job
|
5
|
+
field :upload_file_name, type: String
|
6
|
+
|
7
|
+
def upload(file_name)
|
8
|
+
self.upload_file_name = file_name
|
9
|
+
end
|
10
|
+
|
11
|
+
def perform
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class BatchTestJob < RocketJob::Job
|
16
|
+
field :upload_file_name, type: String
|
17
|
+
field :saved_streams, type: Array
|
18
|
+
|
19
|
+
def upload(file_name, streams: nil)
|
20
|
+
self.upload_file_name = file_name
|
21
|
+
self.saved_streams = streams
|
22
|
+
end
|
23
|
+
|
24
|
+
def perform
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class BadJob < RocketJob::Job
|
29
|
+
def perform
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe RocketJob::Jobs::UploadFileJob do
|
34
|
+
before do
|
35
|
+
RocketJob::Job.delete_all
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#valid?' do
|
39
|
+
it 'validates upload_file_name' do
|
40
|
+
job = RocketJob::Jobs::UploadFileJob.new(job_class_name: UploadFileJobTest::TestJob.to_s)
|
41
|
+
refute job.valid?
|
42
|
+
assert_equal ["can't be blank"], job.errors.messages[:upload_file_name]
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'validates file does not exist' do
|
46
|
+
job = RocketJob::Jobs::UploadFileJob.new(
|
47
|
+
job_class_name: UploadFileJobTest::TestJob.to_s,
|
48
|
+
upload_file_name: '/tmp/blah'
|
49
|
+
)
|
50
|
+
refute job.valid?
|
51
|
+
assert_equal ['Upload file: /tmp/blah does not exist.'], job.errors.messages[:upload_file_name]
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'validates job_class_name' do
|
55
|
+
job = RocketJob::Jobs::UploadFileJob.new(job_class_name: UploadFileJobTest::BadJob.to_s)
|
56
|
+
refute job.valid?
|
57
|
+
assert_equal ['UploadFileJobTest::BadJob must implement any one of: :upload :upload_file_name= :full_file_name= instance methods'], job.errors.messages[:job_class_name]
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'with valid job and upload_file_name' do
|
61
|
+
job = RocketJob::Jobs::UploadFileJob.new(
|
62
|
+
job_class_name: UploadFileJobTest::TestJob.to_s,
|
63
|
+
upload_file_name: __FILE__
|
64
|
+
)
|
65
|
+
assert job.valid?
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#perform' do
|
70
|
+
let :job do
|
71
|
+
RocketJob::Jobs::UploadFileJob.new(
|
72
|
+
job_class_name: UploadFileJobTest::TestJob.name,
|
73
|
+
upload_file_name: __FILE__
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'creates the job' do
|
78
|
+
job.perform_now
|
79
|
+
assert_equal 1, UploadFileJobTest::TestJob.count
|
80
|
+
assert job = UploadFileJobTest::TestJob.first
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'calls upload' do
|
84
|
+
job.perform_now
|
85
|
+
assert job = UploadFileJobTest::TestJob.first
|
86
|
+
assert_equal __FILE__, job.upload_file_name
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'calls upload with original_file_name' do
|
90
|
+
job.job_class_name = BatchTestJob.name
|
91
|
+
job.original_file_name = 'file.zip'
|
92
|
+
job.perform_now
|
93
|
+
assert created_job = UploadFileJobTest::BatchTestJob.first
|
94
|
+
assert_equal __FILE__, created_job.upload_file_name
|
95
|
+
assert_equal %i[file zip], created_job.saved_streams
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/test/plugins/cron_test.rb
CHANGED
@@ -15,7 +15,7 @@ module Plugins
|
|
15
15
|
include RocketJob::Plugins::Cron
|
16
16
|
|
17
17
|
def perform
|
18
|
-
raise 'oh no' if failure_count
|
18
|
+
raise 'oh no' if failure_count.zero?
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
@@ -60,7 +60,6 @@ module Plugins
|
|
60
60
|
assert_equal Time.parse('2015-12-10 06:00:00 UTC'), @job.run_at
|
61
61
|
end
|
62
62
|
end
|
63
|
-
|
64
63
|
end
|
65
64
|
|
66
65
|
describe '#save' do
|
@@ -162,7 +161,6 @@ module Plugins
|
|
162
161
|
end
|
163
162
|
end
|
164
163
|
end
|
165
|
-
|
166
164
|
end
|
167
165
|
end
|
168
166
|
end
|
@@ -23,7 +23,6 @@ module Plugins
|
|
23
23
|
def before_perform_method
|
24
24
|
call_list << 'before_perform_method'
|
25
25
|
end
|
26
|
-
|
27
26
|
end
|
28
27
|
|
29
28
|
# This job adds each callback as they run into an array
|
@@ -45,14 +44,13 @@ module Plugins
|
|
45
44
|
def after_perform_method
|
46
45
|
call_list << 'after_perform_method'
|
47
46
|
end
|
48
|
-
|
49
47
|
end
|
50
48
|
|
51
49
|
# This job adds each callback as they run into an array
|
52
50
|
class AroundPerformJob < RocketJob::Job
|
53
51
|
field :call_list, type: Array, default: []
|
54
52
|
|
55
|
-
around_perform do |
|
53
|
+
around_perform do |_job, block|
|
56
54
|
call_list << 'around_perform_block_before'
|
57
55
|
block.call
|
58
56
|
call_list << 'around_perform_block_after'
|
@@ -71,7 +69,6 @@ module Plugins
|
|
71
69
|
yield
|
72
70
|
call_list << 'around_perform_method_after'
|
73
71
|
end
|
74
|
-
|
75
72
|
end
|
76
73
|
|
77
74
|
# This job adds each callback as they run into an array
|
@@ -86,7 +83,7 @@ module Plugins
|
|
86
83
|
call_list << 'after_perform_block'
|
87
84
|
end
|
88
85
|
|
89
|
-
around_perform do |
|
86
|
+
around_perform do |_job, block|
|
90
87
|
call_list << 'around_perform_block_before'
|
91
88
|
block.call
|
92
89
|
call_list << 'around_perform_block_after'
|
@@ -108,16 +105,15 @@ module Plugins
|
|
108
105
|
call_list << 'before_perform_method'
|
109
106
|
end
|
110
107
|
|
111
|
-
def around_perform_method
|
108
|
+
def around_perform_method
|
112
109
|
call_list << 'around_perform_method_before'
|
113
|
-
|
110
|
+
yield
|
114
111
|
call_list << 'around_perform_method_after'
|
115
112
|
end
|
116
113
|
|
117
114
|
def after_perform_method
|
118
115
|
call_list << 'after_perform_method'
|
119
116
|
end
|
120
|
-
|
121
117
|
end
|
122
118
|
|
123
119
|
describe RocketJob::Plugins::Job::Callbacks do
|
@@ -130,7 +126,7 @@ module Plugins
|
|
130
126
|
@job = BeforePerformJob.new
|
131
127
|
@job.perform_now
|
132
128
|
assert @job.completed?, @job.attributes.ai
|
133
|
-
expected = %w
|
129
|
+
expected = %w[before_perform_block before_perform_method perform]
|
134
130
|
assert_equal expected, @job.call_list, 'Sequence of before_perform callbacks is incorrect'
|
135
131
|
end
|
136
132
|
end
|
@@ -140,7 +136,7 @@ module Plugins
|
|
140
136
|
@job = AfterPerformJob.new
|
141
137
|
@job.perform_now
|
142
138
|
assert @job.completed?, @job.attributes.ai
|
143
|
-
expected = %w
|
139
|
+
expected = %w[perform after_perform_method after_perform_block]
|
144
140
|
assert_equal expected, @job.call_list, 'Sequence of after_perform callbacks is incorrect'
|
145
141
|
end
|
146
142
|
end
|
@@ -150,7 +146,7 @@ module Plugins
|
|
150
146
|
@job = AroundPerformJob.new
|
151
147
|
@job.perform_now
|
152
148
|
assert @job.completed?, @job.attributes.ai
|
153
|
-
expected = %w
|
149
|
+
expected = %w[around_perform_block_before around_perform_method_before perform around_perform_method_after around_perform_block_after]
|
154
150
|
assert_equal expected, @job.call_list, 'Sequence of around_perform callbacks is incorrect'
|
155
151
|
end
|
156
152
|
end
|
@@ -160,11 +156,10 @@ module Plugins
|
|
160
156
|
@job = CombinedPerformJob.new
|
161
157
|
@job.perform_now
|
162
158
|
assert @job.completed?, @job.attributes.ai
|
163
|
-
expected = %w
|
159
|
+
expected = %w[before_perform_block around_perform_block_before before_perform_method around_perform_method_before perform after_perform_method around_perform_method_after around_perform_block_after after_perform_block]
|
164
160
|
assert_equal expected, @job.call_list, 'Sequence of around_perform callbacks is incorrect'
|
165
161
|
end
|
166
162
|
end
|
167
|
-
|
168
163
|
end
|
169
164
|
end
|
170
165
|
end
|
@@ -4,7 +4,6 @@ require_relative '../../test_helper'
|
|
4
4
|
module Plugins
|
5
5
|
module Job
|
6
6
|
class LoggerTest < Minitest::Test
|
7
|
-
|
8
7
|
class LoggerJob < RocketJob::Job
|
9
8
|
def perform
|
10
9
|
logger.debug('DONE', value: 123, other_value: 'HI')
|
@@ -36,7 +35,7 @@ module Plugins
|
|
36
35
|
it 'adds start logging' do
|
37
36
|
@job = LoggerJob.new
|
38
37
|
info_called = false
|
39
|
-
@job.logger.stub(:info, ->
|
38
|
+
@job.logger.stub(:info, ->(description) { info_called = true if description == 'Start #perform' }) do
|
40
39
|
@job.perform_now
|
41
40
|
end
|
42
41
|
assert info_called, "In Plugins::Job::Logger.around_perform logger.info('Start #perform') not called"
|
@@ -45,13 +44,12 @@ module Plugins
|
|
45
44
|
it 'adds completed logging' do
|
46
45
|
@job = LoggerJob.new
|
47
46
|
measure_called = false
|
48
|
-
@job.logger.stub(:measure_info, ->
|
47
|
+
@job.logger.stub(:measure_info, ->(description, *_args) { measure_called = true if description == 'Completed #perform' }) do
|
49
48
|
@job.perform_now
|
50
49
|
end
|
51
50
|
assert measure_called, "In Plugins::Job::Logger.around_perform logger.measure_info('Completed #perform') not called"
|
52
51
|
end
|
53
52
|
end
|
54
|
-
|
55
53
|
end
|
56
54
|
end
|
57
55
|
end
|
@@ -81,14 +81,13 @@ module Plugins
|
|
81
81
|
describe '#queued' do
|
82
82
|
it 'returns all queued jobs' do
|
83
83
|
count = 0
|
84
|
-
RocketJob::Job.queued.each do |
|
84
|
+
RocketJob::Job.queued.each do |_job|
|
85
85
|
count += 1
|
86
86
|
end
|
87
87
|
assert 3, count
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
91
|
-
|
92
91
|
end
|
93
92
|
end
|
94
93
|
end
|
@@ -4,7 +4,6 @@ module Plugins
|
|
4
4
|
module Job
|
5
5
|
# Unit Test for RocketJob::Job
|
6
6
|
class PersistenceTest < Minitest::Test
|
7
|
-
|
8
7
|
class PersistJob < RocketJob::Job
|
9
8
|
self.priority = 53
|
10
9
|
field :data, type: Hash
|
@@ -89,7 +88,6 @@ module Plugins
|
|
89
88
|
assert_equal 1, counts[:scheduled]
|
90
89
|
end
|
91
90
|
end
|
92
|
-
|
93
91
|
end
|
94
92
|
end
|
95
93
|
end
|
@@ -3,7 +3,6 @@ module Plugins
|
|
3
3
|
module Job
|
4
4
|
# Unit Test for RocketJob::Job
|
5
5
|
class StateMachineTest < Minitest::Test
|
6
|
-
|
7
6
|
class StateMachineJob < RocketJob::Job
|
8
7
|
def perform
|
9
8
|
end
|
@@ -111,7 +110,6 @@ module Plugins
|
|
111
110
|
assert_nil @job.exception
|
112
111
|
end
|
113
112
|
end
|
114
|
-
|
115
113
|
end
|
116
114
|
end
|
117
115
|
end
|
@@ -4,7 +4,6 @@ require_relative '../../test_helper'
|
|
4
4
|
module Plugins
|
5
5
|
module Job
|
6
6
|
class ThrottleTest < Minitest::Test
|
7
|
-
|
8
7
|
class ThrottleJob < RocketJob::Job
|
9
8
|
# Only allow one to be processed at a time
|
10
9
|
self.throttle_running_jobs = 1
|
@@ -20,20 +19,20 @@ module Plugins
|
|
20
19
|
RocketJob::Job.delete_all
|
21
20
|
end
|
22
21
|
|
23
|
-
describe '.
|
22
|
+
describe '.throttle?' do
|
24
23
|
it 'defines the running jobs throttle' do
|
25
|
-
assert ThrottleJob.
|
26
|
-
refute ThrottleJob.
|
24
|
+
assert ThrottleJob.throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
25
|
+
refute ThrottleJob.throttle?(:blah?), ThrottleJob.rocket_job_throttles
|
27
26
|
end
|
28
27
|
end
|
29
28
|
|
30
29
|
describe '.undefine_throttle' do
|
31
30
|
it 'undefines the running jobs throttle' do
|
32
|
-
assert ThrottleJob.
|
31
|
+
assert ThrottleJob.throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
33
32
|
ThrottleJob.undefine_throttle(:throttle_running_jobs_exceeded?)
|
34
|
-
refute ThrottleJob.
|
33
|
+
refute ThrottleJob.throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
35
34
|
ThrottleJob.define_throttle(:throttle_running_jobs_exceeded?)
|
36
|
-
assert ThrottleJob.
|
35
|
+
assert ThrottleJob.throttle?(:throttle_running_jobs_exceeded?), ThrottleJob.rocket_job_throttles
|
37
36
|
end
|
38
37
|
end
|
39
38
|
|
@@ -106,7 +105,6 @@ module Plugins
|
|
106
105
|
assert_equal 1, filter.size
|
107
106
|
end
|
108
107
|
end
|
109
|
-
|
110
108
|
end
|
111
109
|
end
|
112
110
|
end
|
@@ -98,7 +98,7 @@ module Plugins
|
|
98
98
|
@job = NoisyJob.new
|
99
99
|
@job.log_level = :warn
|
100
100
|
logged = false
|
101
|
-
@job.logger.stub(:log_internal, ->
|
101
|
+
@job.logger.stub(:log_internal, ->(_level, _index, message, _payload, _exception) { logged = true if message.include?('some very noisy logging') }) do
|
102
102
|
@job.perform_now
|
103
103
|
end
|
104
104
|
assert_equal false, logged
|
@@ -193,7 +193,6 @@ module Plugins
|
|
193
193
|
assert active_worker.duration
|
194
194
|
end
|
195
195
|
end
|
196
|
-
|
197
196
|
end
|
198
197
|
end
|
199
198
|
end
|