我正在编写以下模块以捕获偶尔发送给我的延迟作业工作人员的SIGTERM
,并设置一个名为term_now
的变量,让我的工作能够在它之前正常终止。 ;完成。
如果我把它放在我的工作中,我的模块中的以下代码是完美的,但我需要它用于几个工作,当我把它放在一个模块中它不起作用。
我认为它不起作用,因为它只通过term_now
一次(当它是假的时候),即使它返回true它也不会再次通过它,因此它永远不会停止工作。
module StopJobGracefully
def self.execute(&block)
begin
term_now = false
old_term_handler = trap('TERM') do
term_now = true
old_term_handler.call
end
yield(term_now)
ensure
trap('TERM', old_term_handler)
end
end
end
以下是工作内联代码的正常使用方法(这是我尝试转换为模块的代码):
class SMSRentDueSoonJob
def perform
begin
term_now = false
old_term_handler = trap('TERM') do
term_now = true
old_term_handler.call
end
User.find_in_batches(batch_size: 1000) do
if term_now
raise 'Gracefully terminating job early...'
end
# do lots of complicated work here
end
ensure
trap('TERM', old_term_handler)
end
end
end
答案 0 :(得分:2)
你基本上自己回答了。在您提供的示例代码中,只有在调用term_now
之前捕获陷阱时,yield
才会生效。
您需要做的是提供一种定期提取信息的机制,以便您可以在find_in_batches
的运行中进行检查。
因此,您的模块应该使用term_now
方法而不是产生结果,而不是返回实例变量@term_now
。