【发布时间】:2009-10-22 23:24:16
【问题描述】:
我想在 Rails 关闭时运行一些清理代码 - 这可能吗?我的情况是我在后台有一些线程(我正在使用 jruby 并调用 java),这些线程在进程的生命周期中存在,我需要让他们知道自己关闭
谢谢!
【问题讨论】:
标签: ruby-on-rails jruby
我想在 Rails 关闭时运行一些清理代码 - 这可能吗?我的情况是我在后台有一些线程(我正在使用 jruby 并调用 java),这些线程在进程的生命周期中存在,我需要让他们知道自己关闭
谢谢!
【问题讨论】:
标签: ruby-on-rails jruby
可能应该只使用 Ruby 退出处理程序,它是一个内核方法:
$ irb
>> at_exit do
?> puts 'bye...'
>> end
=> #<Proc:0xb79a87e4@(irb):1>
>> exit
bye...
$
【讨论】:
在 Rails 应用程序的上下文中,放置此类文件的最佳位置是config/initializers。在我的应用程序中,每当开发或测试环境关闭时,我都需要刷新 Redis/Sidekiq 队列。这非常有效。
at_exit do
begin
puts 'Flushing Redis...'
Redis.new.flushall
rescue => e
puts "There was an #{e.to_s} while flushing redis..."
ensure
puts 'Done Flushing Redis!'
end
end unless Rails.env.production?
【讨论】:
请注意,您不得使用 Signal.trap,因为它确实重新定义了设置。调用前一个陷阱有一个技巧:
$prev_trap = Signal.trap("TERM") do
$prev_trap&.call
graceful_shutdown
end
但是 Rails 初始化器在应用服务器启动之前执行,例如Puma 重新定义了大多数信号陷阱,抛弃了定义的内容。 因此不要使用它,它可能适用于 webrick 但不适用于生产环境ální。
所以唯一合理的选择是人们已经推荐的:at_exit in a initializer。
【讨论】: