在默认情况下,当一个程序接收到 SIGTERM 信号时,它将尽快停止并退出。但是,一些后台任务可能需要在退出之前完成一些操作。Active::Job 和 Shoryuken 都为这种情况提供了下面的解决方法。
对于 Active::Job,您可以使用 before_perform 和 after_perform 钩子来执行一些任务。例如,以下代码将在执行任务之前打印一个消息并在执行任务之后更新任务状态并再次打印一个消息。
class SampleJob < ActiveJob::Base
before_perform do |job|
Rails.logger.info "Starting job #{job.job_id}"
end
after_perform do |job|
Rails.logger.info "Completed job #{job.job_id}"
job.update(status: "completed")
end
def perform(*args)
# Do some work here...
end
end
对于 Shoryuken,您可以使用 Signal.trap 方法来注册一个信号处理程序。例如,以下代码将在 SIGTERM 信号上打印一个消息和在退出之前清理所有资源。
require 'shoryuken'
Signal.trap('TERM') do
puts "Received SIGTERM. Shutting down gracefully..."
Shoryuken.stop
end
class SampleWorker
include Shoryuken::Worker
shoryuken_options queue: 'default'
def perform(sqs_msg, body)
# Do some work here...
end
end
这样,当接收到 SIGTERM 信号时,Signal.trap 中的代码将执行,然后会执行 Shoryuken.stop 方法来优雅地停止 Shoryuken 工作进程。
希望这个解决方案对您有用!