rocketjob 3.5.1 → 3.5.2
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/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
|