summaryrefslogtreecommitdiff
path: root/lib/task.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/task.rb')
-rw-r--r--lib/task.rb68
1 files changed, 58 insertions, 10 deletions
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