From 9fe1f6870cfd12c34eb4efef8f4e199e8324c1af Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Sun, 19 Feb 2012 16:03:10 +0000 Subject: task handling fixed for http codes > 202 --- lib/task.rb | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 10 deletions(-) (limited to 'lib/task.rb') diff --git a/lib/task.rb b/lib/task.rb index 50616d7..52d4a30 100644 --- a/lib/task.rb +++ b/lib/task.rb @@ -1,28 +1,47 @@ -require File.join(File.dirname(__FILE__),'spork') +require File.join(File.dirname(__FILE__),'error') DEFAULT_TASK_MAX_DURATION = 36000 module OpenTox # Class for handling asynchronous tasks class Task + attr_accessor :pid def self.create service_uri, params={} task = Task.new RestClient.post(service_uri,params).chomp - pid = Spork.spork do + pid = fork do begin - task.completed yield - rescue => error - task.error error + result_uri = yield + if result_uri.uri? + task.completed result_uri + else + raise "#{result_uri} is not a valid URI" + end + rescue + # TODO add service URI to Kernel.raise + # serialize error and send to task service + #task.error $! + task.error $! + raise end end + Process.detach(pid) task.pid = pid task end + def kill + begin + Process.kill(9,pid) + rescue + end + end + def description metadata[RDF::DC.description] end def cancel + kill RestClient.put(File.join(@uri,'Cancelled'),{}) end @@ -30,19 +49,24 @@ module OpenTox RestClient.put(File.join(@uri,'Completed'),{:resultURI => uri}) end - def error(error) - RestClient.put(File.join(@uri,'Error'),{:errorReport => OpenTox::Error.new(error)}) + def error error + $logger.error self if $logger + kill + report = ErrorReport.create(error,"http://localhost") + RestClient.put(File.join(@uri,'Error'),{:errorReport => report}) + #RestClient.put(File.join(@uri,'Error'),{:message => error, :backtrace => error.backtrace}) end # waits for a task, unless time exceeds or state is no longer running - # @param [optional,Numeric] dur seconds pausing before cheking again for completion + # @param [optional,Numeric] dur seconds pausing before checking again for completion def wait_for_completion(dur=0.3) due_to_time = Time.new + DEFAULT_TASK_MAX_DURATION - while self.running? + while running? sleep dur raise "max wait time exceeded ("+DEFAULT_TASK_MAX_DURATION.to_s+"sec), task: '"+@uri.to_s+"'" if (Time.new > due_to_time) end end + end def method_missing(method,*args) @@ -55,13 +79,37 @@ module OpenTox when /\?/ return hasStatus == method.sub(/\?/,'').capitalize else - return metadata[RDF::OT[method]].to_s + response = metadata[RDF::OT[method]].to_s + response = metadata[RDF::OT1[method]].to_s #if response.empty? # API 1.1 compatibility + if response.empty? + $logger.error "No #{method} metadata for #{@uri} " + raise "No #{method} metadata for #{@uri} " + end + return response end rescue + $logger.error "Unknown #{self.class} method #{method}" super end end + # override to read all error codes + def metadata reload=true + if reload + @metadata = {} + # ignore error codes from Task services (may contain eg 500 which causes exceptions in RestClient and RDF::Reader + RestClient.get(@uri) do |response, request, result, &block| + $logger.warn "#{@uri} returned #{result}" unless response.code == 200 or response.code == 202 + RDF::Reader.for(:rdfxml).new(response) do |reader| + reader.each_statement do |statement| + @metadata[statement.predicate] = statement.object if statement.subject == @uri + end + end + end + end + @metadata + end + #TODO: subtasks end -- cgit v1.2.3