lib/qs/qs_runner.rb in qs-0.6.1 vs lib/qs/qs_runner.rb in qs-0.7.0
- old
+ new
@@ -1,6 +1,6 @@
-require 'system_timer'
+require 'much-timeout'
require 'qs'
require 'qs/runner'
module Qs
@@ -12,34 +12,26 @@
super(handler_class, args)
@timeout = handler_class.timeout || Qs.config.timeout
end
def run
- OptionalTimeout.new(self.timeout) do
- self.handler.qs_run_callback 'before'
- self.handler.qs_init
- self.handler.qs_run
- self.handler.qs_run_callback 'after'
+ MuchTimeout.optional_timeout(self.timeout, TimeoutInterrupt) do
+ catch(:halt) do
+ self.handler.qs_run_callback 'before'
+ catch(:halt){ self.handler.qs_init; self.handler.qs_run }
+ self.handler.qs_run_callback 'after'
+ end
end
- rescue TimeoutError => exception
- error = TimeoutError.new "#{handler_class} timed out (#{timeout}s)"
+ rescue TimeoutInterrupt => exception
+ error = Qs::TimeoutError.new "#{handler_class} timed out (#{timeout}s)"
error.set_backtrace(exception.backtrace)
raise error
end
- private
+ # this error should never be "swallowed", if it is caught be sure to re-raise
+ # it so the workers will be able to honor their timeout setting. otherwise
+ # workers will never timeout.
+ TimeoutInterrupt = Class.new(Interrupt)
- module OptionalTimeout
- def self.new(timeout, &block)
- if !timeout.nil?
- SystemTimer.timeout_after(timeout, TimeoutError, &block)
- else
- block.call
- end
- end
- end
-
end
-
- TimeoutError = Class.new(RuntimeError)
end