rocketjob 3.5.1 → 3.5.2
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/lib/rocket_job/jobs/on_demand_job.rb +10 -11
- data/lib/rocket_job/jobs/upload_file_job.rb +2 -0
- data/lib/rocket_job/plugins/cron.rb +17 -30
- data/lib/rocket_job/plugins/job/model.rb +14 -0
- data/lib/rocket_job/plugins/restart.rb +1 -1
- data/lib/rocket_job/plugins/singleton.rb +16 -11
- data/lib/rocket_job/version.rb +1 -1
- data/test/jobs/upload_file_job_test.rb +9 -1
- data/test/plugins/singleton_test.rb +1 -1
- data/test/test_db.sqlite3 +0 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bd3505de7a318efb53880ef4c0f506a970d1ee30277f531bef7e2a9f257cf500
|
|
4
|
+
data.tar.gz: '085e0371c60662b51ba53c4e5e6e1b2e016cdc2e37de1b51a437e5477f907a22'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a9a9441957a5405ed1d3d98bbe5bf0a45febbbdf8283c09de967f19abd1e5a7470cc871d66b804f8569ad90b48732fcd4d649e3d0c282b60be2b000bdd60adc8
|
|
7
|
+
data.tar.gz: d47b9c8a4eba0fd88798b76926da8c4073b0c26c6743ae3b54883535f278ea3317d6fb7901d57caf8506f710b5fdb7151b9acae65e7e2427bf2607a0c926231a
|
|
@@ -74,23 +74,16 @@ module RocketJob
|
|
|
74
74
|
include RocketJob::Plugins::Cron
|
|
75
75
|
include RocketJob::Plugins::Retry
|
|
76
76
|
|
|
77
|
-
self.
|
|
78
|
-
self.description = 'Generalized Job'
|
|
77
|
+
self.description = 'On Demand Job'
|
|
79
78
|
self.destroy_on_complete = false
|
|
80
79
|
self.retry_limit = 0
|
|
81
80
|
|
|
82
81
|
# Be sure to store key names only as Strings, not Symbols
|
|
83
|
-
field :data, type: Hash, default: {}
|
|
84
|
-
field :code, type: String
|
|
82
|
+
field :data, type: Hash, default: {}, copy_on_restart: true
|
|
83
|
+
field :code, type: String, copy_on_restart: true
|
|
85
84
|
|
|
86
85
|
validates :code, presence: true
|
|
87
|
-
|
|
88
|
-
begin
|
|
89
|
-
job.send(:load_code)
|
|
90
|
-
rescue Exception => exc
|
|
91
|
-
job.errors.add(attr, "Failed to parse :code, #{exc.inspect}")
|
|
92
|
-
end
|
|
93
|
-
end
|
|
86
|
+
validate :validate_code
|
|
94
87
|
|
|
95
88
|
before_perform :load_code
|
|
96
89
|
|
|
@@ -99,6 +92,12 @@ module RocketJob
|
|
|
99
92
|
def load_code
|
|
100
93
|
instance_eval("def perform\n#{code}\nend", __FILE__, __LINE__)
|
|
101
94
|
end
|
|
95
|
+
|
|
96
|
+
def validate_code
|
|
97
|
+
load_code
|
|
98
|
+
rescue Exception => exc
|
|
99
|
+
errors.add(:code, "Failed to parse :code, #{exc.inspect}")
|
|
100
|
+
end
|
|
102
101
|
end
|
|
103
102
|
end
|
|
104
103
|
end
|
|
@@ -63,6 +63,8 @@ module RocketJob
|
|
|
63
63
|
if original_file_name && defined?(IOStreams)
|
|
64
64
|
streams = IOStreams.streams_for_file_name(original_file_name)
|
|
65
65
|
job.upload(upload_file_name, streams: streams)
|
|
66
|
+
# job.upload sets the archived filename, we want it to be the original file name.
|
|
67
|
+
job.upload_file_name = original_file_name
|
|
66
68
|
else
|
|
67
69
|
job.upload(upload_file_name)
|
|
68
70
|
end
|
|
@@ -2,7 +2,13 @@ require 'active_support/concern'
|
|
|
2
2
|
|
|
3
3
|
module RocketJob
|
|
4
4
|
module Plugins
|
|
5
|
-
#
|
|
5
|
+
# Allow jobs to run on a predefined schedule, much like a crontab.
|
|
6
|
+
#
|
|
7
|
+
# Notes:
|
|
8
|
+
# - No single point of failure since their is no centralized scheduler.
|
|
9
|
+
# - `cron_schedule` can be edited at any time via the web interface.
|
|
10
|
+
# - A scheduled job can be run at any time by calling `#run_now!` or
|
|
11
|
+
# by clicking `Run Now` in the web interface.
|
|
6
12
|
module Cron
|
|
7
13
|
extend ActiveSupport::Concern
|
|
8
14
|
|
|
@@ -11,15 +17,8 @@ module RocketJob
|
|
|
11
17
|
|
|
12
18
|
field :cron_schedule, type: String, class_attribute: true, user_editable: true, copy_on_restart: true
|
|
13
19
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
validates_each :cron_schedule do |record, attr, value|
|
|
17
|
-
begin
|
|
18
|
-
RocketJob::Plugins::Rufus::CronLine.new(value) if value
|
|
19
|
-
rescue ArgumentError => exc
|
|
20
|
-
record.errors.add(attr, exc.message)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
20
|
+
validate :rocket_job_cron_valid
|
|
21
|
+
before_save :rocket_job_cron_set_run_at
|
|
23
22
|
|
|
24
23
|
private
|
|
25
24
|
|
|
@@ -41,25 +40,6 @@ module RocketJob
|
|
|
41
40
|
end
|
|
42
41
|
end
|
|
43
42
|
|
|
44
|
-
# Returns [Time] at which this job was intended to run at.
|
|
45
|
-
#
|
|
46
|
-
# Takes into account any delays that could occur.
|
|
47
|
-
# Recommended to use this Time instead of Time.now in the `#perform` since the job could run outside its
|
|
48
|
-
# intended window. Especially if a failed job is only retried quite sometime later.
|
|
49
|
-
#
|
|
50
|
-
# Notes:
|
|
51
|
-
# * When `cron_schedule` is set, this would be the `run_at` time, otherwise it is the `created_at` time
|
|
52
|
-
# since that would be the intended time for which this job is running.
|
|
53
|
-
def scheduled_at
|
|
54
|
-
run_at || created_at
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# Make this job run now, regardless of the cron schedule.
|
|
58
|
-
# Upon completion the job will automatically reschedule itself.
|
|
59
|
-
def run_now!
|
|
60
|
-
update_attributes(run_at: nil) if cron_schedule
|
|
61
|
-
end
|
|
62
|
-
|
|
63
43
|
# Returns [Time] the next time this job will be scheduled to run at.
|
|
64
44
|
#
|
|
65
45
|
# Parameters
|
|
@@ -72,10 +52,17 @@ module RocketJob
|
|
|
72
52
|
|
|
73
53
|
private
|
|
74
54
|
|
|
75
|
-
def
|
|
55
|
+
def rocket_job_cron_set_run_at
|
|
76
56
|
return unless cron_schedule
|
|
77
57
|
self.run_at = rocket_job_cron_next_time if cron_schedule_changed? && !run_at_changed?
|
|
78
58
|
end
|
|
59
|
+
|
|
60
|
+
def rocket_job_cron_valid
|
|
61
|
+
return unless cron_schedule
|
|
62
|
+
RocketJob::Plugins::Rufus::CronLine.new(cron_schedule)
|
|
63
|
+
rescue ArgumentError => exc
|
|
64
|
+
errors.add(:cron_schedule, exc.message)
|
|
65
|
+
end
|
|
79
66
|
end
|
|
80
67
|
end
|
|
81
68
|
end
|
|
@@ -259,6 +259,20 @@ module RocketJob
|
|
|
259
259
|
running? && worker_name.present? ? [worker_name] : []
|
|
260
260
|
end
|
|
261
261
|
|
|
262
|
+
# Clear `run_at` so that this job will run now.
|
|
263
|
+
def run_now!
|
|
264
|
+
update_attributes(run_at: nil) if run_at
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
# Returns [Time] at which this job was intended to run at.
|
|
268
|
+
#
|
|
269
|
+
# Takes into account any delays that could occur.
|
|
270
|
+
# Recommended to use this Time instead of Time.now in the `#perform` since the job could run outside its
|
|
271
|
+
# intended window. Especially if a failed job is only retried quite sometime later.
|
|
272
|
+
def scheduled_at
|
|
273
|
+
run_at || created_at
|
|
274
|
+
end
|
|
275
|
+
|
|
262
276
|
# Returns [Hash] status of this job
|
|
263
277
|
def as_json
|
|
264
278
|
attrs = serializable_hash(methods: %i[seconds duration])
|
|
@@ -2,23 +2,28 @@ require 'active_support/concern'
|
|
|
2
2
|
|
|
3
3
|
module RocketJob
|
|
4
4
|
module Plugins
|
|
5
|
-
# Prevent
|
|
5
|
+
# Prevent this job from being saved if another is running, queued, or paused.
|
|
6
6
|
module Singleton
|
|
7
7
|
extend ActiveSupport::Concern
|
|
8
8
|
|
|
9
9
|
included do
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
validate :rocket_job_singleton_check
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Returns [true|false] whether another instance of this job is already active
|
|
14
|
+
def rocket_job_singleton_active?
|
|
15
|
+
self.class.where(:state.in => %i[running queued], :id.ne => id).exists?
|
|
16
|
+
end
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
# Validation prevents a new job from being saved while one is already running
|
|
21
|
+
def rocket_job_singleton_check
|
|
22
|
+
return unless (running? || queued? || paused?) && rocket_job_singleton_active?
|
|
23
|
+
|
|
24
|
+
errors.add(:state, "Another instance of #{self.class.name} is already running, queued, or paused")
|
|
21
25
|
end
|
|
26
|
+
|
|
22
27
|
end
|
|
23
28
|
end
|
|
24
29
|
end
|
data/lib/rocket_job/version.rb
CHANGED
|
@@ -88,10 +88,18 @@ class UploadFileJobTest < Minitest::Test
|
|
|
88
88
|
|
|
89
89
|
it 'calls upload with original_file_name' do
|
|
90
90
|
job.job_class_name = BatchTestJob.name
|
|
91
|
-
job.original_file_name = 'file.zip'
|
|
92
91
|
job.perform_now
|
|
93
92
|
assert created_job = UploadFileJobTest::BatchTestJob.first
|
|
94
93
|
assert_equal __FILE__, created_job.upload_file_name
|
|
94
|
+
assert_nil created_job.saved_streams
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'job retains the original_file_name when present' do
|
|
98
|
+
job.job_class_name = BatchTestJob.name
|
|
99
|
+
job.original_file_name = 'file.zip'
|
|
100
|
+
job.perform_now
|
|
101
|
+
assert created_job = UploadFileJobTest::BatchTestJob.first
|
|
102
|
+
assert_equal 'file.zip', created_job.upload_file_name
|
|
95
103
|
assert_equal %i[file zip], created_job.saved_streams
|
|
96
104
|
end
|
|
97
105
|
end
|
|
@@ -75,7 +75,7 @@ module Plugins
|
|
|
75
75
|
@job.start!
|
|
76
76
|
job2 = SingletonJob.new
|
|
77
77
|
refute job2.valid?
|
|
78
|
-
assert_equal ['Another instance of Plugins::SingletonTest::SingletonJob is already queued or
|
|
78
|
+
assert_equal ['Another instance of Plugins::SingletonTest::SingletonJob is already running, queued, or paused'], job2.errors.messages[:state]
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
it 'passes if another job is active, but this job is not' do
|
data/test/test_db.sqlite3
CHANGED
|
Binary file
|
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.5.
|
|
4
|
+
version: 3.5.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Reid Morrison
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-05-
|
|
11
|
+
date: 2018-05-31 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: aasm
|