Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
9926fd86
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
9926fd86
编写于
12月 09, 2019
作者:
R
Rafael França
提交者:
GitHub
12月 09, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #37827 from Edouard-chin/ec-activejob-enqueuing
Don't run AJ after_enqueue / after_perform when chain is halted:
上级
7f4d222c
bbfab0b3
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
117 addition
and
4 deletion
+117
-4
activejob/CHANGELOG.md
activejob/CHANGELOG.md
+14
-0
activejob/lib/active_job/callbacks.rb
activejob/lib/active_job/callbacks.rb
+23
-4
activejob/test/cases/callbacks_test.rb
activejob/test/cases/callbacks_test.rb
+55
-0
activejob/test/jobs/abort_before_enqueue_job.rb
activejob/test/jobs/abort_before_enqueue_job.rb
+4
-0
railties/lib/rails/application/configuration.rb
railties/lib/rails/application/configuration.rb
+4
-0
railties/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt
...ates/config/initializers/new_framework_defaults_6_1.rb.tt
+2
-0
railties/test/application/configuration_test.rb
railties/test/application/configuration_test.rb
+15
-0
未找到文件。
activejob/CHANGELOG.md
浏览文件 @
9926fd86
*
Don't run
`after_enqueue`
and
`after_perform`
callbacks if the callback chain is halted.
class MyJob < ApplicationJob
before_enqueue { throw(:abort) }
after_enqueue { # won't enter here anymore }
end
`after_enqueue` and `after_perform` callbacks will no longer run if the callback chain is halted.
This behaviour is a breaking change and won't take effect until Rails 6.2.
To enable this behaviour in your app right now, you can add in your app's configuration file
`config.active_job.skip_after_callbacks_if_terminated = true`
*Edouard Chin*
*
Fix enqueuing and performing incorrect logging message.
Jobs will no longer always log "Enqueued MyJob" or "Performed MyJob" when they actually didn't get enqueued/performed.
...
...
activejob/lib/active_job/callbacks.rb
浏览文件 @
9926fd86
# frozen_string_literal: true
require
"active_support/callbacks"
require
"active_support/core_ext/object/with_options"
require
"active_support/core_ext/module/attribute_accessors"
module
ActiveJob
# = Active Job Callbacks
...
...
@@ -27,16 +29,33 @@ class << self
end
included
do
define_callbacks
:perform
define_callbacks
:enqueu
e
class_attribute
:return_false_on_aborted_enqueue
,
instance_accessor:
false
,
instance_predicate:
false
,
default:
false
cattr_accessor
:skip_after_callbacks_if_terminated
,
instance_accessor:
false
,
default:
fals
e
class_attribute
:return_false_on_aborted_enqueue
,
instance_accessor:
false
,
instance_predicate:
false
self
.
return_false_on_aborted_enqueue
=
false
with_options
(
skip_after_callbacks_if_terminated:
skip_after_callbacks_if_terminated
)
do
define_callbacks
:perform
define_callbacks
:enqueue
end
end
# These methods will be included into any Active Job object, adding
# callbacks for +perform+ and +enqueue+ methods.
module
ClassMethods
def
inherited
(
klass
)
unless
skip_after_callbacks_if_terminated
ActiveSupport
::
Deprecation
.
warn
(
<<~
EOM
)
In Rails 6.2, ActiveJob's `after_enqueue` and `after_perform` callbacks will no longer run in case the
callback chain is halted (i.e. `throw(:abort)` is thrown in a before_enqueue callback).
To enable this behaviour right now, add in your application configuration file
`config.active_job.skip_after_callbacks_if_terminated = true`.
EOM
end
klass
.
get_callbacks
(
:enqueue
).
config
[
:skip_after_callbacks_if_terminated
]
=
skip_after_callbacks_if_terminated
klass
.
get_callbacks
(
:perform
).
config
[
:skip_after_callbacks_if_terminated
]
=
skip_after_callbacks_if_terminated
super
end
# Defines a callback that will get called right before the
# job's perform method is executed.
#
...
...
activejob/test/cases/callbacks_test.rb
浏览文件 @
9926fd86
...
...
@@ -43,8 +43,63 @@ class CallbacksTest < ActiveSupport::TestCase
ActiveJob
::
Base
.
return_false_on_aborted_enqueue
=
prev
end
test
"#enqueue does not run after_enqueue callbacks when skip_after_callbacks_if_terminated is true"
do
prev
=
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
true
reload_job
job
=
AbortBeforeEnqueueJob
.
new
job
.
enqueue
assert_nil
(
job
.
flag
)
ensure
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
prev
end
test
"#enqueue does run after_enqueue callbacks when skip_after_callbacks_if_terminated is false"
do
prev
=
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
false
reload_job
job
=
AbortBeforeEnqueueJob
.
new
job
.
enqueue
assert_equal
(
"after_enqueue"
,
job
.
flag
)
ensure
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
prev
end
test
"#perform does not run after_perform callbacks when skip_after_callbacks_if_terminated is true"
do
prev
=
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
true
reload_job
job
=
AbortBeforeEnqueueJob
.
new
job
.
perform_now
assert_nil
(
job
.
flag
)
ensure
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
prev
end
test
"#perform does run after_perform callbacks when skip_after_callbacks_if_terminated is false"
do
prev
=
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
false
reload_job
job
=
AbortBeforeEnqueueJob
.
new
job
.
perform_now
assert_equal
(
"after_perform"
,
job
.
flag
)
ensure
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
=
prev
end
test
"#enqueue returns self when the job was enqueued"
do
job
=
CallbackJob
.
new
assert_equal
job
,
job
.
enqueue
end
private
def
reload_job
Object
.
send
(
:remove_const
,
:AbortBeforeEnqueueJob
)
$LOADED_FEATURES
.
delete
(
$LOADED_FEATURES
.
grep
(
%r{jobs/abort_before_enqueue_job}
).
first
)
require
"jobs/abort_before_enqueue_job"
end
end
activejob/test/jobs/abort_before_enqueue_job.rb
浏览文件 @
9926fd86
...
...
@@ -4,7 +4,11 @@ class AbortBeforeEnqueueJob < ActiveJob::Base
MyError
=
Class
.
new
(
StandardError
)
before_enqueue
:throw_or_raise
after_enqueue
{
self
.
flag
=
"after_enqueue"
}
before_perform
{
throw
(
:abort
)
}
after_perform
{
self
.
flag
=
"after_perform"
}
attr_accessor
:flag
def
perform
raise
"This should never be called"
...
...
railties/lib/rails/application/configuration.rb
浏览文件 @
9926fd86
...
...
@@ -163,6 +163,10 @@ def load_defaults(target_version)
if
respond_to?
(
:active_storage
)
active_storage
.
track_variants
=
true
end
if
respond_to?
(
:active_job
)
active_job
.
skip_after_callbacks_if_terminated
=
true
end
else
raise
"Unknown version
#{
target_version
.
to_s
.
inspect
}
"
end
...
...
railties/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt
浏览文件 @
9926fd86
...
...
@@ -11,3 +11,5 @@
# Track Active Storage variants in the database.
# Rails.application.config.active_storage.track_variants = true
# Rails.application.config.active_job.skip_after_callbacks_if_terminated = true
railties/test/application/configuration_test.rb
浏览文件 @
9926fd86
...
...
@@ -2277,6 +2277,21 @@ class ::DummySerializer < ActiveJob::Serializers::ObjectSerializer; end
assert_equal
false
,
ActiveJob
::
Base
.
return_false_on_aborted_enqueue
end
test
"ActiveJob::Base.skip_after_callbacks_if_terminated is true by default"
do
app
"development"
assert_equal
true
,
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
end
test
"ActiveJob::Base.skip_after_callbacks_if_terminated is false in the 6.0 defaults"
do
remove_from_config
'.*config\.load_defaults.*\n'
add_to_config
'config.load_defaults "6.0"'
app
"development"
assert_equal
false
,
ActiveJob
::
Base
.
skip_after_callbacks_if_terminated
end
test
"ActiveStorage.queues[:analysis] is :active_storage_analysis by default"
do
app
"development"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录