Package org.cytoscape.jobs
This package provides a mechanism for executing remote jobs from within Cytoscape.
The goal is to provide reusable mechanisms that may be utilized by Cytoscape
apps to marshal data, submit a remote job, check on the status of the submitted
job, fetch the results and unmarshal the data.
There are three main components of an implementation of a remote job:
- An implementation of
CyJobExecutionService
, which provides communication with the remote service. TheCyJobExecutionService
is responsible for creating (and implementing) theCyJob
object, which is the object that maintains the state of the remote job and gets serialized and deserialized in sessions. Implementations ofCyJobExecutionService
should store enough information in theirCyJob
object to restore the state of the job across sessions. Note thatCyJobExecutionServices
are, in fact, services. That is, there is expected to be one service running for all jobs and all uses. As such, implementations ofCyJobExecutionService
should not store any state. - An implementation of
CyJobDataService
, which provides the marshalling and unmarshalling of the data. TheCyJobDataService
is responsible for creating and implementing theCyJobData
object, which contains all of the data to be sent to the remote service. Typically, aCyJobExecutionService
will use a particularCyJobDataService
that works with it's remote service. A givenCyJobDataService
might be used by multipleCyJobExecutionServices
. As noted above, implementations ofCyJobDataService
are also services and should not store any state. If the implementation provides methods to serializeCyNetworks
,CyTables
orCyNetworkViews
, it may need to save the SUIDs of those objects to be able to restore them after session restore (SUIDs are not preserved across sessions). To assist with this, a utility classSUIDUtil
is provided. - An app, that will choose the appropriate
CyJobExecutionService
, implement aorg.cytoscape.jobs.CyJobHandler
to listen for status changes in jobs and when the job is complete load the data and merge it into Cytoscape (if appropriate).
- An app will use OSGi to find the
CyJobExecutionService
it is interested in utilizing. - The app will create an empty
CyJob
by callinggetCyJob
method. - The app should register a method that implements
org.cytoscape.jobs.CyJobHandler
to be notified of changes in the job status - The app should then retreive the
CyJobDataService
from theCyJobExecutionService
and add any data necessary to submit the job. - The app will then call
executeJob
, where:- the
CyJob
is the empty job that was created in step #2 - the
String
, if not null will override the basePath in theCyJob
for establishing a connection to the remote servic e
- the
Map
contains any configuration information required to execute the job. This might include authentication credentials or algorithm options. - and the
CyJobData
is the data to be serialized and sent as input for the remote job
- the
- If the
CyJobStatus
indicates that the submission was successful, the job should be added to theCyJobManager
({@see org.cytoscape.jobs.CyJobManager#addJob(org.cytoscape.jobs.CyJob, org.cytoscape.jobs.CyJobHandler, int)}). - The
CyJobManager
will callCyJobExecutionService.checkJobStatus(org.cytoscape.jobs.CyJob)
and report the results to the App'sorg.cytoscape.jobs.CyJobHandler
- After the job finishes, the user (not the App) is informed and when the user indicates that
the results should be retrieved and processed, a Cytoscape
Task
is executed by theTaskManager
. TheTask
will callorg.cytoscape.jobs.CyJobHandler#loadData(org.cytoscape.jobs.CyJob, org.cytoscape.work.TaskMonitor)
method to actually load the data. This is done within the context of a CytoscapeTask
so that the standard mechanisms in Cytoscape for reporting progress to the user and avoid threading issues are utilized.
While the above describes the normal workflow, there are a couple of things that might happen that will deviate from this workflow:
- The job might return an error of some sort ({@see org.cytoscape.jobs.CyJobStatus.Status}). The
CyJobManager
notes the error and the user is informed in GUI. - The user might save the session. This requires the state information in the
CyJob
to be saved in the session by calling theCyJobExecutionService.saveJobInSession(org.cytoscape.jobs.CyJob, java.io.File)
method. - When the session is restored, the
CyJobManager
will callCyJobExecutionService.restoreJobFromSession(org.cytoscape.session.CySession, java.io.File)
method to restore the session, reestablish theorg.cytoscape.jobs.CyJobHandler
(assuming that it's registered), and resuming the polling of the job.
-
Interface Summary Interface Description CyJob ACyJob
represents all of the state information necessary to marshal and unmarshal data, submit jobs, query job status, and fetch results.CyJobData CyJobData presents a general interface to sending data to and receiving data from a job.CyJobDataService The main interface for the marshalling and unmarshalling of data to be exchanged with remote services.CyJobExecutionService TheCyJobExecutionService
is a stateless service that can be used to provide remote job services, including the execution, cancellation, status checking, and retrieval of results.CyJobManager CyJobManager
is responsible for managing all currently runningCyJobs
, including polling for changes in theStatus
of the job and notifying theCyJobMonitor
provided by the App of the change in status.CyJobMonitor Apps are expected to implement this interface to receive notifications about job completions. -
Class Summary Class Description AbstractCyJob This can be used as a base class for custom implementations ofCyJob
CyJobStatus This object stores information about the status of aCyJob
, including the actual job status (CyJobStatus.Status
) and any message returned from the remote execution.SUIDUtil This utility class provides methods to save and restore SUIDs that are sent to remote execution environments across sessions. -
Enum Summary Enum Description CyJobStatus.Status This enum contains the primary status returned from the remote execution.