开发者

Shutdown hook for Rails

开发者 https://www.devze.com 2022-12-09 11:30 出处:网络
I\'d like to have some cleanup code开发者_JS百科 run when Rails is shutting down - is that possible?My situation is that I have a few threads in the background (I\'m using jruby and calling into java)

I'd like to have some cleanup code开发者_JS百科 run when Rails is shutting down - is that possible? My situation is that I have a few threads in the background (I'm using jruby and calling into java) that live for the life of the process and I need to let them know to shut themselves down

Thanks!


Probably should just use the Ruby exit handler, which is a Kernel method:

$ irb
>> at_exit do
?>   puts 'bye...'
>> end
=> #<Proc:0xb79a87e4@(irb):1>
>> exit
bye...
$ 


Within the context of a Rails Application, the best place to put such a file is in config/initializers. In my app, I needed to Flush the Redis/Sidekiq queue whenever the development or test environments shut down. This works perfectly.

config/initializers/at_exit.rb

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?


Be aware that you must not use Signal.trap because it does redefine what was set. There is a trick to call previous trap:

$prev_trap = Signal.trap("TERM") do
  $prev_trap&.call
  graceful_shutdown
end

However Rails initializators are executed before app server starts, e.g. Puma redefines most of the signal traps throwing away what was defined. Therefore do not use this, it might work maybe for webrick but not in production environmentální.

So the only reasonable option is what was already recommended by folks: at_exit in an initializer.

0

精彩评论

暂无评论...
验证码 换一张
取 消