我希望在Rails关闭时运行一些清理代码 - 这可能吗?我的情况是我在后台有一些线程(我正在使用jruby并调用java),这些线程一直存在于进程的生命中,我需要让他们知道关闭自己
谢谢!
答案 0 :(得分:17)
可能应该只使用Ruby退出处理程序,这是一个内核方法:
$ irb
>> at_exit do
?> puts 'bye...'
>> end
=> #<Proc:0xb79a87e4@(irb):1>
>> exit
bye...
$
答案 1 :(得分:0)
在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?
答案 2 :(得分:0)
请注意,您一定不要使用 Signal.trap
,因为它会重新定义设置。有一个技巧可以调用上一个陷阱:
$prev_trap = Signal.trap("TERM") do
$prev_trap&.call
graceful_shutdown
end
然而,Rails初始化程序是在应用服务器启动之前执行的,例如Puma重新定义了大多数信号陷阱,从而丢弃了所定义的东西。 因此请勿使用,它可能适用于webrick,但不适用于生产环境ální。
因此,唯一合理的选择是人们已经建议的:at_exit
在初始化程序中。