File tree Expand file tree Collapse file tree 4 files changed +30
-1
lines changed Expand file tree Collapse file tree 4 files changed +30
-1
lines changed Original file line number Diff line number Diff line change
1
+ * Raise a more specific error during deserialization when a previously serialized job class is now unknown.
2
+
3
+ ` ActiveJob::UnknownJobClassError ` will be raised instead of a more generic
4
+ ` NameError ` to make it easily possible for adapters to tell if the ` NameError `
5
+ was raised during job execution or deserialization.
6
+
7
+ * Earlopain*
1
8
2
9
Please check [ 8-0-stable] ( https://github.com/rails/rails/blob/8-0-stable/activejob/CHANGELOG.md ) for previous changes.
Original file line number Diff line number Diff line change @@ -39,6 +39,7 @@ module ActiveJob
39
39
autoload :Arguments
40
40
autoload :DeserializationError , "active_job/arguments"
41
41
autoload :SerializationError , "active_job/arguments"
42
+ autoload :UnknownJobClassError , "active_job/core"
42
43
autoload :EnqueueAfterTransactionCommit
43
44
44
45
eager_autoload do
Original file line number Diff line number Diff line change 1
1
# frozen_string_literal: true
2
2
3
3
module ActiveJob
4
+ # Raised during job payload deserialization when it references an uninitialized job class.
5
+ class UnknownJobClassError < NameError
6
+ def initialize ( job_class_name )
7
+ super ( "Failed to instantiate job, class `#{ job_class_name } ` doesn't exist" , job_class_name )
8
+ end
9
+ end
10
+
4
11
# = Active Job \Core
5
12
#
6
13
# Provides general behavior that will be included into every Active Job
@@ -60,7 +67,10 @@ def successfully_enqueued?
60
67
module ClassMethods
61
68
# Creates a new job instance from a hash created with +serialize+
62
69
def deserialize ( job_data )
63
- job = job_data [ "job_class" ] . constantize . new
70
+ job_class = job_data [ "job_class" ] . safe_constantize
71
+ raise UnknownJobClassError , job_data [ "job_class" ] unless job_class
72
+
73
+ job = job_class . new
64
74
job . deserialize ( job_data )
65
75
job
66
76
end
Original file line number Diff line number Diff line change @@ -38,6 +38,17 @@ class JobSerializationTest < ActiveSupport::TestCase
38
38
assert_equal h2 . serialize , h3 . serialize
39
39
end
40
40
41
+ test "deserialize raises a specific exception on unknown `job_class`" do
42
+ payload = HelloJob . new . serialize
43
+
44
+ # Simulate the job class being missing, for example during rolling deploys when
45
+ # the server enqueues a new job but the job processor hasn't been restarted yet.
46
+ payload [ "job_class" ] = "IDontExist"
47
+ assert_raises ( ActiveJob ::UnknownJobClassError ) do
48
+ HelloJob . deserialize ( payload )
49
+ end
50
+ end
51
+
41
52
test "deserialize sets locale" do
42
53
job = HelloJob . new
43
54
job . deserialize "locale" => "es"
You can’t perform that action at this time.
0 commit comments